单例即一个类是能有一个实例,并提供一个当前类的全局唯一访问入口(getInstance)。防止类被多次实例化和clone。

一、单例模式<?php

class Singleton

{

private static $instance = null;

// 禁止被实例化

private function __construct()

{

}

// 禁止clone

private function __clone()

{

}

//  实例化自己并保存到$instance中,已实例化则直接调用

public static function getInstance(): object

{

if (empty(self::$instance)) {

self::$instance = new self();

}

return self::$instance;

}

public function test(): string

{

return '这是一个单例模式';

}

}

// 两次调用返回同一个实例

$single1 = Singleton::getInstance();

$single2 = Singleton::getInstance();

var_dump($single1, $single2);

echo $single1->test();

// new Singleton(); // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context

// clone $single1; // Fatal error: Uncaught Error: Call to private Singleton::__construct() from invalid context

输出:object(Singleton)#1 (0) { } object(Singleton)#1 (0) { } 这是一个单例模式

二、单例模式的应用

tp6框架容器中单例模式:/**

* 容器管理类 支持PSR-11

*/

class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable

{

/**

* 容器对象实例

* @var Container|Closure

*/

protected static $instance;

/**

* 容器中的对象实例

* @var array

*/

protected $instances = [];

/**

* 容器绑定标识

* @var array

*/

protected $bind = [];

/**

* 容器回调

* @var array

*/

protected $invokeCallback = [];

/**

* 获取当前容器的实例(单例)

* @access public

* @return static

*/

public static function getInstance()

{

if (is_null(static::$instance)) {

static::$instance = new static;

}

if (static::$instance instanceof Closure) {

return (static::$instance)();

}

return static::$instance;

}

// ...

}

数据库连接<?php

class SingletonMysql

{

private static $instance = null;

private static $db = null;

const DB_TYPE = 'mysql';

const DB_HOST = '127.0.0.1';

const DB_NAME = 'mysql';

const DB_USER = 'root';

const DB_PASS = '123456';

const DB_MS = self::DB_TYPE . ':host=' . self::DB_HOST . ';' . 'dbname=' . self::DB_NAME;

// 数据库连接

private function __construct()

{

try {

self::$db = new PDO(self::DB_MS, self::DB_USER, self::DB_PASS);

self::$db->query('set names utf8mb4');

self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {

die('error:' . $e->getMessage());

}

}

// 禁止clone

private function __clone()

{

}

public static function getInstance(): object

{

if (empty(self::$instance)) {

self::$instance = new self();

}

return self::$instance;

}

public function query(string $sql = ''): array

{

return self::$db->query($sql)->fetch();

}

}

$mysql = SingletonMysql::getInstance();

var_dump($mysql->query('SELECT VERSION();'));

输出结果:array(2) { ["VERSION()"]=> string(6) "5.7.26" [0]=> string(6) "5.7.26" }

测试代码下载:

php mysql 单例模式_php单例模式相关推荐

  1. php mysql 单例模式_PHP单例模式_PHP单例模式数据库连接类

    添加查询数据库的方法,方法后注释有参数填写的例子与格式 public function select($table,$condition=array(),$field = array(),$limit ...

  2. php 管理 mysql 数据库 代码_安装并使用phpMyAdmin管理MySQL数据库_php

    学会使用基于web数据库的管理工具phpMyAdmin. 如果使用合适的工具,mysql数据库的管理就会为得相当简单.应用MySQL命令行方式需要对MySQL知识非常熟悉,对SQL语言也是同样的道理. ...

  3. php用到的mysql语句_PHP中常用到的一些MySQL语句_php

    在php开发中,经常会使用到mysql语句,下面就为您列举了一些经常使用的MySQL语句,希望对您平时的学习和开发工作能起到些许的作用. MySQL语句显示数据库或表: show databases; ...

  4. php备份mysql页面_如何用PHP的页面备份、恢复Mysql数据库_php

    //备份数据 $i   =   0; $crlf="/r/n"; $dbname="xgtqr"; global     $dbconn; http://www ...

  5. C++单例模式:单例模式遇到多线程

    单例模式介绍 单例模式主要有2中形式,一种是饿汉式,一种是懒汉式. 饿汉式:程序一加载单例模式就已经创建了,也就很饥饿嘛.因为是静态属性进行单例初始化,所以优点是线程是安全的,缺点是无论用户是否使用单 ...

  6. 什么是单例模式以及单例模式的几种实现

    什么是单例模式? 单例模式,是一种常用的软件设计模式.通过单例模式可以保证系统中,应用该模式的这个类只有一个实例,即一个类只有一个对象实例.下面讲讲他的四种实现. 1. 饿汉式单例设计模式 饿汉单例设 ...

  7. 【设计模式】单例模式是什么?如何实现单例模式?单例模式常见问题?

    目录 1. 单例模式 1. 单例模式的三要素 2. 优点 3. 单例的实现方式(思路:思考一下Java创建对象的几种方式?好像解题思路也不对...基本都是通过new出来的) 1. 饿汉模式单例(在类加 ...

  8. Android中的单例模式(java单例模式详解,Glide,EventBus,LayoutInfalter的源码单例模式详解)

    一.单例模式 (1)单例模式介绍和定义 ​ 大概意思是保证一个类在任何时候都只有一个实例在内存里,以static形式提供整个项目的访问.在Android系统中常用的地方有:创建一个SQLiteOpen ...

  9. php mysql 单例模式_PHP基于单例模式实现的mysql类

    本文实例讲述了PHP基于单例模式实现的mysql类.分享给大家供大家参考,具体如下:<?php defined('ACC')||exit('Access Denied'); // 封装mysql ...

最新文章

  1. gin路由打开html页面,Gin(二):使用路由
  2. Catterplots包,让你绘制不一样的图
  3. 关于ubuntu中的inittab文件
  4. 关于map的下标操作的2个例子
  5. Membership学习(三)Membership Providers介绍[xgluxv]
  6. 管理系统制作的python代码_python学生管理系统代码实现
  7. java 对象复制字段_利用Java反射机制实现对象相同字段的复制
  8. 人为什么总感觉莫名的心烦?
  9. 基于SQL Server策略的管理–类别和数据库订阅
  10. 超详细中文车牌识别开源库EasyPR入门实战(win10_VS2019_opencv34)
  11. ant-design tree 设置默认选中状态_[路由系列]5分钟设置一台Ubiquiti的ERX路由器
  12. android 语音自动播报,Android语音播报的两种简单实现
  13. linux下du和df结果不一致的原因及处理
  14. PNG生成多尺寸ico文件,开发桌面应用必备
  15. 什么软件可以清除流氓软件
  16. linux下文件恢复方法,Linux下误删文件恢复办法
  17. 怎么解决win10以太网无有效ip
  18. Python基础教程之Matplotlib-基础绘图
  19. vega使用方法笔记
  20. 数据库sql简单的优化方案

热门文章

  1. asp.net mvc源码分析-Controllerl篇 ControllerDescriptor
  2. 战神引擎架设php,【战神引擎】1.96影刺版35整理一键端+双端+架设教程
  3. linux vim 怎么查找,linux下vim 查找命令
  4. 深入理解JVM看这篇就够了
  5. linux修改程序文件内容,linux 批量修改文件内容
  6. antd table分页居中
  7. 数据库性能监控工具 Spotlight on MySQL
  8. dr计算机操作,【dr操作规程】_DR操作规程
  9. uniapp中nvue页面中设置超出显示省略号
  10. python getopt使用_【python】getopt使用