码迷,mamicode.com
首页 > Web开发 > 详细

50)PHP,单例模式

时间:2017-08-16 09:49:49      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:ges   image   构造   const   private   func   echo   实例   images   

 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 }

 

50)PHP,单例模式

标签:ges   image   构造   const   private   func   echo   实例   images   

原文地址:http://www.cnblogs.com/xiaoyoucai/p/7371465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!