標籤:empty 資訊 執行個體化 實現 stat cte nbsp highlight var_dump
1:
其實單例模式,說白了就是說一個類只能執行個體化一次。但是我們如何在這個執行個體化一次上面做文章呢。其實有個突破口就是__construct()這個魔術方法。這個方法就代表著如果類執行個體化的時候,就會自動執行這個方法。然後如果我把這個方法變成保護或者私人的,會是什麼效果呢。
<?phpclass test{protected function __construct(){}}$test = new test();?>
然後執行以下,就會出現這個情況。
這樣的話,就不能執行個體化了。這樣就保證不能隨便讓人給執行個體化了。
但是既然這樣的話,我們應該怎麼實現執行個體化呢。就是這樣:
<?phpclass test{protected function __construct(){}public static function getInstance(){$_test = new test();return $_test;}}$test = test::getInstance();var_dump($test);?>
這樣的話。執行個體的話,就能出現了。我們看一下:
但是說了這麼多,我還是沒說到重點。下面重點來了,只要我們再使用一個關鍵字(static)就好了。鐺鐺鐺鐺:
<?phpclass test{protected function __construct(){}public static function getInstance(){static $_test;if (empty($_test)) {$_test = new test();}return $_test;}}$test1 = test::getInstance();$test2 = test::getInstance();$test3 = test::getInstance();var_dump($test1,$test2,$test3);echo $test1 == $test2 ? ‘true‘ : ‘false‘;echo "<br>";echo $test2 == $test3 ? ‘true‘ : ‘false‘;echo "<br>";echo $test1 == $test3 ? ‘true‘ : ‘false‘;?>
看一下結果:
這樣的話就能實現php單例的效果了。
單例的話,最長用在需要只使用這一個類,而不是會有多個類。
打個比方。比如現在有個config類,這個類主要是儲存這個項目的配置資訊。如果說這個類能執行個體化多次的話,那麼如果在代碼運行中對配置進行了修改,那麼你怎麼知道是在哪個配置類中進行了修改了呢。這個時候的話使用單例模式,就避免了情況的發生,所有對於設定檔的改變都是基於這個類的執行個體進行修改的。而不會出現因為多個類的執行個體化,操作對於操作的改變沒有進行即時的更新。而且,執行個體多個類庫,佔用記憶體也會非常的厲害,這樣只執行個體化一次。是不是好處多多呢。鮑國梟
連結:https://www.zhihu.com/question/35285158/answer/62151947
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。2:來,帶你裝B帶你飛;
/*單例設計模式 (單態) 定義: 一個類 只能允許有 一個對象存在. 1.不讓進: 使類不能被執行個體化 2.留後門: 設定靜態方法 3.給對象: 在靜態方法裡執行個體化該類 4.判初夜: 判斷是否是 第一次產生該類的對象 5.設靜態: 靜態方法裡 要使用靜態屬性 *//*//1.不讓進: 使類不能被執行個體化-----------------class Test{ // 設定 一個封裝的構造方法 private function __construct() { //佔位, 我就是不讓你NEW我~~~ }}*//*//2.留後門: 設定靜態方法--------------------class Test{ // 設定 一個封裝的構造方法 private function __construct() { //佔位, 我就是不讓你NEW我~~~ } //後門 public static function getObject() { echo "啊,我是後門,進吧!<br>"; }}*//*//3.給對象: 在靜態方法裡執行個體化該類------------------class Test{ // 設定 一個封裝的構造方法 private function __construct() { //佔位, 我就是不讓你NEW我~~~ } //後門 public static function getObject() { echo "啊,我是後門,進吧!<br>"; return new self();//執行個體化一個對象給你 }}*//*//4.判初夜: 判斷是否是 第一次產生該類的對象------------------class Test{ private $obj = null;//屬性值為對象,預設為null // 設定 一個封裝的構造方法 private function __construct() { //佔位, 我就是不讓你NEW我~~~ } //後門 public static function getObject() { echo "啊,我是後門,進吧!<br>"; if ($this->obj === null) { $this->obj = new self();//執行個體化一個對象 } //返回的屬性 其實就是本對象 return $this->obj; }}*///5.設靜態: 靜態方法裡 要使用靜態屬性------------------class Test{ private static $obj = null;//屬性值為對象,預設為null // 設定 一個封裝的構造方法 private function __construct() { //佔位, 我就是不讓你NEW我~~~ } //後門 public static function getObject() { echo "啊,我是後門,進吧!<br>"; if (self::$obj === null) { self::$obj = new self();//執行個體化一個對象 } //返回的屬性 其實就是本對象 return self::$obj; }}/*Test::getObject();//使用靜態方法訪問該類裡的方法exit;*/$t1 = Test::getObject();$t2 = Test::getObject();$t3 = Test::getObject();$t4 = Test::getObject();$t5 = Test::getObject();$t6 = Test::getObject();$t7 = Test::getObject();$t8 = Test::getObject();//判斷 兩個對象 是否是同一個對象if ($t1 === $t6) { echo "哦, Yes! 是同一個執行個體<br>";} else { echo "哦, No! 不是同一個執行個體<br>";}
第五步是成品,前面4步都是一步一步的推的!獨身待蒼顏
連結:https://www.zhihu.com/question/35285158/answer/141024074
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
看懂php單例模式-清晰簡潔的回答