单例模式的学习总结

 

燕十八 公益PHP培训 
课堂地址:YY频道88354001 
学习社区:www.zixue.it

单例模式的学习总结:
1.构造函数需要标记为private,如果考虑到继承,则设置为protected。
另外构造函数要用final修饰方法,防止子类构造函数重写。
2.拥有一个保存类的实例的静态成员变量
3.拥有一个访问这个实例的公共的静态方法
4.需要创建__clone()方法防止对象被复制(克隆)

 1 <?php
 2     class single {
 3         public $hash;   //随机码  来判断生成的对象是否相同
 4         static protected $ins = NULL;   //  用静态属性储存生成的 对象
 5         
 6         final protected function __construct(){  //final修饰方法 ,则此方法可以继承,不可以重写
 7             $this->hash = mt_rand(1,99999); //创建对象时,给对象一个随机码
 8         }
 9 
10         public function __clone(){
11             trigger_error('Clone is not allow!',E_USER_ERROR);     //防止克隆
12         }
13 
14         
15         static public function getInstance() {
16             if(self::$ins instanceof self) { //instanceof判断某个对象是不是某个类的实例 
17                 return self::$ins;
18             }
19 
20             self::$ins = new self();     //如果对象实例不存在 那么就创建一个对象实例 
21             return self::$ins;
22         }
23 }
24 
25 $s1 = single::getInstance();
26 $s2 = single::getInstance();
27 print_r($s1);
28 print_r($s2);
29 if($s1 === $s2) {
30     echo '是一个对象<br />';
31 } else {
32     echo '不是一个对象<br />';
33 }
34 echo '<hr />';
35 
36 class test extends single {
37 }
38 $t1 = test::getInstance();
39 $t2 = test::getInstance();
40 print_r($t1);
41 print_r($t2);
42 if($t1 === $t2) {
43     echo '是一个对象<br />';
44 } else {
45     echo '不是一个对象<br />';
46 }
47 //注意:此时t1,t2,s1,s2 为相同的对象,子类调用的getInstance()为父类层次上的。
48 
49 $danli_clone = clone $t2; 
50 /*
51 //如果可以克隆,那么克隆的和被克隆的不是一个对象
52 echo '<hr />';
53 print_r($danli_clone);
54 if($danli_clone === $t2) {
55     echo '是一个对象<br />';
56 } else {
57     echo '不是一个对象<br />';
58 }
59 */
60 
61 ?>
posted @ 2012-11-13 15:20  小刘_php  阅读(118)  评论(0)    收藏  举报