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 条评论