50)PHP,单例模式

 1 class B{
 2     public $v1 = 10;
 3 
 4     private static $instance;
 5 
 6     private function __construct(){}
 7     public static function getNew(){
 8         //如果本类中的$instance还没有数据
 9         if( !isset(B::$instance) ){
10             B::$instance = new self;
11         }
12         return B::$instance;
13     }
14     private function __clone(){}
15 }
16 //$o1 = new B();//出错,因为构造方法私有了,
17 $o1 = B::getNew();
18 $o1->v1 = 100;    //修改
19 $o2 = B::getNew();
20 var_dump($o1);
21 echo "<br />";
22 var_dump($o2);
23 $o3 = clone $o1;    //克隆对象
24 echo "<br />";
25 var_dump($o3);
26 $o1->v1 = 123;
27 echo "<br />o1中的v1为:" . $o1->v1;
28 echo "<br />o2中的v1为:" . $o2->v1;
29 echo "<br />o3中的v1为:" . $o3->v1;

然后结果截图:

 但是,有一个问题,虽然单例模式可以让类只是实例化一次,但是每一个类都有一个魔法函数clone,那么就可以创建的新的类,所以,我们要防止用clone创建新的类,就有了在我们的单例模式类里面给那个clone函数变成私有的,这样,我们在这类的外面就不能用clone函数了,代码如下:

 1 class B{
 2     public $v1 = 10;
 3 
 4     private static $instance;
 5 
 6     private function __construct(){}
 7     public static function getNew(){
 8         //如果本类中的$instance还没有数据
 9         if( !isset(B::$instance) ){
10             B::$instance = new self;
11         }
12         return B::$instance;
13     }
14 //下面的这个private就是将clone变成私有的,在类的外面就不能用clone克隆了。
15     private function __clone(){}
16 }

 

posted @ 2017-08-16 09:02  小油菜1  阅读(228)  评论(0编辑  收藏  举报