PHP單例模式簡記
阿新 • • 發佈:2018-01-09
結果 隱私 php單例模式 tin ont st2 受保護 src 如何實現
單例模式:只能實例化一次即為單例模式
如何實現只能實例化一次:突破口在於類的構造函數,我們把構造方法變為隱私或者受保護的方法,然後執行代碼
<?php Class Temp { protected function __construct () { } } $test = new Temp();
上面的代碼執行會有如下報錯
這樣的話就不能實例化了,別人也不能隨便的實例化它,但是我們自己應該如何實例化它呢?進一步修改代碼
<?php Class Temp { protected function __construct () { }public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test = Temp::getInstance(); var_dump($test);
運行代碼,便可以得到一個對象
這說明我們已經成功的實例化了這個類,這說明我們成功的實例化了這個類。
但是這並沒有達到我們要的目的,修改代碼如下
<?php Class Temp { protected function __construct () { }public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test1 = Temp::getInstance(); $test2 = Temp::getInstance(); $test3 = Temp::getInstance(); if ($test1 === $test2) { echo ‘同一個‘; } else { echo ‘不是同一個‘; }
執行代碼
等到else的結果,這證明這是兩個不一樣的實例,也就是說我們並沒有實現單例,繼續修改代碼如下
<?php Class Temp { protected function __construct () { } public static function getInstance () { static $test; if (empty($test)) { $test = new Temp(); } return $test; } } // $test = new Temp(); $test1 = Temp::getInstance(); $test2 = Temp::getInstance(); $test3 = Temp::getInstance(); if ($test1 === $test2) { echo ‘同一個‘; } else { echo ‘不是同一個‘; }
運行代碼
這次獲得的結果為條件成立的結果,證明這兩個實例其實是同一個實例,到此我們便實現了我們的目的,這個類只會被實例化一次,此即為單例模式。
PHP單例模式簡記