-
概念
是一种类的设计只会最多产生一个对象的设计思想
-
作用
- php的应用主要在于数据库应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new操作消耗的资源。
- 如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。
- 再一次页面请求中,便于进行调试,因为所有的代码都会集中在一个类里面,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo。
-
应用场景
数据库连接,缓存操作,分布式储存
-
单例模式的要点
- 构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化。
- 拥有一个保存类的实例的静态成员变量。
- 拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
- 简称 三私一公:
- 私有化构造方法:不让在外部产生多个对象
- 私有化克隆方法:不允许对象被克隆产生新对象
- 私有化静态属性:运行进入类内部产生对象
- 公有化静态方法:保存已经产生的对象
<?php //单例 class Uni{ //创建静态私有的变量保存该类对象 static private $instance; //参数 private $config; //防止直接创建对象 private function __construct($config){ $this -> config = $config; echo "我被实例化了"; } //防止克隆对象 private function __clone(){ } static public function getInstance($config){ //判断$instance是否是Uni的对象 //没有则创建 if (!self::$instance instanceof self) { self::$instance = new self($config); } return self::$instance; } public function getName(){ echo $this -> config; } } $db1 = Uni::getInstance(1); $db1 -> getName(); echo "<br>"; $db2 = Uni::getInstance(4); $db2 -> getName(); /** *运行结果: *我被实例化了1 *1 *$db1创建对象后,参数是1 *$db2没有创建对象,而是直接使用$instance保存的唯一对象,所以输出的参数并没有变为4; */