PHP实现单例模式
文章目录
定义:单例模式是一种类的设计,只会最多产生一个对象的设计思想
-
首先定义一个空类,叫做
Singleton
<?php class Singleton { }
-
禁止实例化,只禁止在类外部实例化对象,私有化构造方法
class Singleton { // 私有化构造方法 private function __construct() { echo __METHOD__,'<br>'; } }
-
这样外部就不能进行实例化对象,意味着不能产生对象了,此时只能想办法在还没有产生对象的时候进入到“类内部”,意味着只能通过
静态方法
让类直接进入到类的内部// 在上述类中增加公有静态方法 public static function getInstance() { }
-
进入类内部以然还是没有对象,此时需要在静态方法内部进行对象实例化,并且把得到的对象返回到外部
public static function getInstance() { return new self(); } // 外部获取对象 $s = Singleton::getInstance();
-
第一次可以示例化对象,但是还是可以通过访问静态方法依旧可以实例化新的对象,此时返回数据需要静态属性
class Singleton { // 静态属性,保存生产出来的对象 private static $object = null; // 初始化为null,没有对象 // 私有化构造方法 private function __construct() { echo __METHOD__,'<br>'; } // 类入口,允许类进入类内部 public static function getInstance() { // 判断静态属性是否存在当前类的对象 if (!self::$object instanceof self) { // 当前保存的object数据不是Singleton的对象 // 产生对象 self::$object = new self(); } // 返回对象 return self::$object; } } // 用静态方法进入到类内部 $s = Singleton::getInstance(); var_dump($s);
-
此时可以保证外部无论多少次调用公有静态方法获取实例,都会只得到一个对象。但是此时外部对象依然可以产生新的对象:因为克隆,所以还必须禁止对象的克隆,即在类内部私有化克隆方法。
// 在类中添加私有化的__clone()方法 private function __clone(){}
总结
- 单例模式就是设计的类最多只能得到一个对象
- 单例模式的设计规范就是“三私一公”
- 私有化构造方法:禁止在类外无线实例对象
- 私有化克隆方法:禁止对象无限克隆对象
- 私有化静态数据:保存类内部实例化得到的对象
- 公有静态方法:允许外部通过调用类内部方法获取对象
- 单例模式的目的是为了保护资源的唯一性
- 单例模式如果还要其他功能诉求,可以在类中增加相应的其他类成员