-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathSingleton.php
More file actions
executable file
·91 lines (63 loc) · 2.21 KB
/
Singleton.php
File metadata and controls
executable file
·91 lines (63 loc) · 2.21 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
/**
* 单一就是独苗,独一份的意思
* 中国的历史上一般都是一个朝代一个皇帝,有两个皇帝的话,必然要PK出一个皇帝出来
*
*/
class Emperor {
private static $emperor = null; //定义一个皇帝在那里,然后给这个皇帝名字
private function __construct(){}
private function __clone(){} //防止对象被克隆
public static function getInstance() {
if(Emperor::$emperor == null) {
Emperor::$emperor = new Emperor;
}
return Emperor::$emperor;
}
public function emperorInfo() {
var_dump('我就是皇帝xxx');
}
}
/* 大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了! */
$emperor1 = Emperor::getInstance(); // 第一天见的皇帝名字
$emperor1->emperorInfo();
$emperor2 = Emperor::getInstance(); // 第二天见的皇帝名字
$emperor2->emperorInfo();
$emperor3 = Emperor::getInstance(); // 三天见的皇帝是同一个人
$emperor3->emperorInfo();
/* 测试单例模式被对象克隆破坏,clone */
class Boss {
private $name;
private static $instance = null;
private function __construct() {} // 不能构造
// private function __clone() {} // 对象不能克隆
public static function getInstance() {
if(self::$instance == null) {
self::$instance = new Boss;
}
return self::$instance;
}
public function bossInfo() {
var_dump('我是老板'.$this->name);
}
public function setName($name) {
$this->name = $name;
}
}
$boss1 = Boss::getInstance();
$boss2 = Boss::getInstance();
$boss3 = clone $boss2;
$boss1->setName('jxy_1');
$boss2->setName('jxy_2');
$boss3->setName('jxy_3');
$boss1->bossInfo();
$boss2->bossInfo();
$boss3->bossInfo();
/** 输出结果
* string '我是老板jxy_2' (length=13)
* string '我是老板jxy_2' (length=13)
* string '我是老板jxy_3' (length=13)
* 说明clone破坏了单例模式
* 处理方法是:覆写一个私有的clone方法,可以杜绝clone。
*/
?>