php之单例模式

  单例模式:指一个类只能实力化一个对象,主要思路,

  1:保护或私有构造函数,并用final来修饰,防止外部实例化

  2:类内部开放一个公共的静态方法,负责实例化

  3:类内部用一个静态属性来存放对象,当静态属性存在对象时,就return该对象,否则就实例化一个对象

 1 /*
 2 final这个关键词,在php中,可以修饰类,方法,但不能修饰属性
 3 final修饰的类,不能继承
 4 final修饰的方法,能继承,但不能重写
 5 在java中,final也可以修饰属性,此时属性值是一个常量,不可修改
 6 */
 7 <?php
 8 class s{
 9     public $hash;//随机码
10     static protected $ins = NULL;
11     final protected function  __construct(){
12         $this->hash = mt_rand(1,9999);//用final修饰构造函数,让子类可以继承构造函数,但不能重写
13     }
14     static public function getInstance(){//静态函数,只能用类名::函数名()来访问
15         if (self::$ins instanceof self) {//instanceof 判断某个对象是不是某个类的实例
16             return self::$ins;
17         }
18         self::$ins = new self();
19         return self::$ins;
20     }
21 }
22 class t extends s{
23     //protected function __construct(){
24         //parent::__construct();//Fatal error: Cannot override final method s::__construct()因为父类的构造函数用final修饰,所以不能重写构造函数
25     //}
26 }
27 $s1 = t::getInstance();//访问静态函数
28 $s2 = t::getInstance();//$s2和$s1实际是同一个对象,这样一个简单的单例模式就创造出来了
29 $s3 = clone $s2;//clone一个对象,注意克隆对象不等于原来的对象,只有两个对象同时指向一个地址时才相等
30 print_r($s1);
31 print_r($s2);
32 if ($s1 === $s2) {
33     echo '是一个对象';
34 }else {
35     echo '不是一个对象';
36 }
37 echo '<br />';
38 if ($s2 === $s3) {
39     echo '是一个对象';
40 }else {
41     echo '不是一个对象';
42 }
43 //clone又多出一个对象,试问怎么解决?
44 //提示:请看魔术方法clone!
45 //魔术法国法很多,__construct,_destruct,__clone,__callstatic
46 ?>

 

posted @ 2015-05-28 19:28  museluo  阅读(358)  评论(0编辑  收藏  举报