单例模式-PHP 语言实现

概念

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

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

作用

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

PHP 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class singleTon {
trueprivate static $instance = null;
true
trueprivate $member = 1;
true
truefinal private function __construct() {}

truepublic static function getInstance() {
truetrueif (empty(self::$instance)) {
truetruetrueself::$instance = new self();
truetrue}
truetruereturn self::$instance;
true}

truepublic function hello() {
truetrueecho 'hello, singleton';
true}

truefinal private function __clone() {}
}

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

输出如下:

1
2
3
4
5
6
7
8
9
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)