当前位置:首页 > 叨叨念念 > PHP单例模式实例

PHP单例模式实例

叨叨念念 / 星之宇 / 2021-11-16 10:16 / 浏览:810 / 评论:0

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

    • 昵称
    • 邮箱
    • 网址