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 }