PHP程序中一个类的对象实例在整个程序运行过程中只需创建一个,则可以将这个类设计为单例类,可以避免多次创建带来系统的额外消耗。
PHP单例模式实例1:基础单例
通过类的静态成员属性来实现的。在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让户可以使用它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
Class Singleton{ // 保存类实例的静态成员变量 private static $instance = null; // 私有构造函数 private function __construct(){} // 私有克隆方法,防止克隆 private function __clone(){} // 公共静态方法,实例化该类本身,只实例化一次 public static function getInstance(){ if(self::$instance === null){ self::$instance = new self(); } eturn self::$instance; } } // 调用实例 $singleton = Singleton::getInstance();
PHP单例模式实例2:多库单例
单例模式同时连接多个数据库或者缓存时,一个类同时要多库使用。
Class Singleton{ // 保存类实例的静态成员变量 private static $instance = array(); protected $name; // 私有构造函数 private function __construct($config){ $this->name = $config; } // 私有克隆方法,防止克隆 private function __clone(){} // 公共静态方法,实例化该类本身,只实例化一次 public static function getInstance(array $config){ $hash = md5(implode('',$config)); if(!isset(self::$instance[$hash])){ self::$instance[$hash] = new self($config); } return self::$instance[$hash]; } public function test(){ var_dump($this->name); } } // 调用实例 $singleton1 = Singleton::getInstance(['host'=>'192.168.1.2','user'=>'77bx','pass'=>'123456']); $singleton2 = Singleton::getInstance(['host'=>'192.168.1.3','user'=>'77bx','pass'=>'654321']); $singleton1->test(); // array(3) { ["host"]=> string(11) "192.168.1.2" ["user"]=> string(4) "77bx" ["pass"]=> string(6) "123456" } $singleton2->test(); // array(3) { ["host"]=> string(11) "192.168.1.3" ["user"]=> string(4) "77bx" ["pass"]=> string(6) "654321" }
PHP单例模式实例3:继承单例类
abstract class Singleton{ final protected function __construct(){ $this->init(); } abstract protected function init(); final protected function __clone(){} public static function getInstance(){ if(static::$instance === null){ static::$instance = new static(); } return static::$instance; } public function test(){ echo get_class($this).':'; var_dump($this->config); echo '<br />'; } } Class A extends Singleton{ protected static $instance = null; protected function init(){ $this->config = ['host'=>'192.168.1.2','user'=>'77bx','pass'=>'123456']; } } Class B extends Singleton{ protected static $instance = null; protected function init(){ $this->config = ['host'=>'192.168.1.3','user'=>'77bx','pass'=>'654321']; } } // 调用实例 $a = A::getInstance(); $b = B::getInstance(); $a->test(); //A:array(3) { ["host"]=> string(11) "192.168.1.2" ["user"]=> string(4) "77bx" ["pass"]=> string(6) "123456" } $b->test(); //B:array(3) { ["host"]=> string(11) "192.168.1.3" ["user"]=> string(4) "77bx" ["pass"]=> string(6) "654321" }
目前有 0 条评论