单例模式的学习总结
燕十八 公益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 ?>

浙公网安备 33010602011771号