单例模式-PHP 语言实现

概念

数学与逻辑学中,singleton定义为“有且仅有一个元素的集合”。

单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

作用

通过单例模式可以保证系统中使用单例模式的类只有一个实例。

PHP 实现

class singleTon {
private static $instance = null;

private $member = 1;

final private function __construct() {}

public static function getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}

public function hello() {
echo 'hello, singleton';
}

final private function __clone() {}
}

$s1 = singleTon::getInstance();
$s2 = singleTon::getInstance();
var_dump($s1, $s2);
$s1->hello();

输出如下:

object(singleTon)#1 (1) {
["member":"singleTon":private]=>
int(1)
}
object(singleTon)#1 (1) {
["member":"singleTon":private]=>
int(1)
}
hello, singleton

注意:

  • PHP 不支持类属性定义时表达式赋值所以无法实现饿汉式单例模式。
  • PHP 单例,只是进程中的单例。

如何确保只有一个实例

  1. 让外部无法创建实例,禁止 new、继承、克隆
  2. 在内部提供创建实例的方法

验证:

  1. 使用 var_dump 函数,每个对象会有不同的 id,上文输出显示变量 $s1$s2 是同一个实例(id 为 1)