標籤: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,單例模式