您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關PHP中怎么實現單例模式,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
單例模式,是一種常用的軟件設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例,即一個類只有一個對象實例。通俗來講就是通過提供自身共享實例的訪問,單例設計模式用于限制特定對象只能被創建一次,來看下這個單例模式的要點:
1.一個類只能有一個對象;
2.必須是自行創建這個類的對象;
3,要想整個系統提供這一個對象;
從具體實現的角度來說,可以按著下面這三點來理解:
一是單例模式的類只提供私有的構造函數,
二是類定義中含有一個該類的靜態私有對象,
三是該類提供了一個靜態的公有的函數用于創建或獲取它本身的靜態私有對象。
最主要的就是還要有一個private的clone方法,防止克隆,得記得哈。
優點如下:
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點如下:
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用。
來看下咱寫的案例 :
class Test{ static private $instance; private $age; private $name; private function __construct($name,$age) { $this->name = $name; $this->age = $age; echo "construct".PHP_EOL; } private function __clone() { // TODO: Implement __clone() method. } static public function set_name($name,$age) { if (!self::$instance instanceof self) { self::$instance = new self($name,$age); } return self::$instance; } public function get_name() { echo $this -> name.PHP_EOL; echo $this -> age.PHP_EOL; } } $object_1 = Test::set_name("cuijinpeng","26"); $object_1->get_name(); echo "<br>"; $object_2 = Test::set_name("luyaran","27"); $object_2->get_name();
運行結果:
construct cuijinpeng 26
cuijinpeng 26
從上述實例中,我們可以看出,$object_1創建對象后,參數是"cuijinpeng","26",但是$object_2并沒有創建對象,而是直接使用$instance保存的唯一對象,所以輸出的參數并沒有變為"luyaran","27"。
關于PHP中怎么實現單例模式就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。