php單例模式詳解
其實單例模式,說白了就是說一個類別只能實例化一次。但是我們要如何在這個實例化一次上面做文章呢。其實有個突破口就是__construct()這個魔術方法。這個方法就代表如果類別實例化的時候,就會自動執行這個方法。然後如果我把這個方法變成保護或私有的,會是什麼效果呢。
<?php class test{ protected function __construct(){ } } $test = new test(); ?>
然後執行下列,就會出現這個情況。
<img data-rawheight="125" data-rawwidth="994" src="https://img.php.cn/upload/article/000/054 /025/a79c550120d3e119df603c5755b0f293-0.jpg" class="origin_image zh-lightbox-thumb" width="994&科18628d34e0d3_r.jpg"> 這樣的話,就不能實例化了。這樣就保證不能隨便讓人給實例化了。
但是既然這樣的話,我們該怎麼實作實例化呢。就是這樣:
<?phpclass test{ protected function __construct(){ } public static function getInstance(){ $_test = new test(); return $_test; }}$test = test::getInstance();var_dump($test);?>
這樣的話。實例的話,就能出現了。讓我們來看看:
<img data-rawheight="50" data-rawwidth="152" src="https://img.php.cn/upload/article/000/ 054/025/a79c550120d3e119df603c5755b0f293-1.jpg" class="content_image" width="152">我說了這麼多,但我說到了這麼多重點。下面重點來了,只要我們再用一個關鍵字(static)就好了。鐺鐺鐺鐺:
<?php class 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'; ?>
看看結果:
<img data-rawheight="160" data-rawwidth= "133" src="https://img.php.cn/upload/article/000/054/025/a79c550120d3e119df603c5755b0f293-2.jpg" class=" gt;這樣的話就能實現php單例的效果了。
單例的話,最長用在需要只使用這一類,而不是會有多個類別。
打個比方。例如現在有個config類,這個類別主要是儲存這個專案的設定資訊。如果說這個類別能實例化多次的話,那麼如果在程式碼運行中對配置進行了修改,那麼你怎麼知道是在哪個配置類別中進行了修改了呢。這時候的話使用單例模式,就避免了情況的發生,所有對於設定檔的改變都是基於這個類別的實例進行修改的。而不會出現因為多個類別的實例化,操作對於操作的改變沒有即時的更新。而且,實例多個類別庫,佔用記憶體也會非常的厲害,這樣只會實例化一次。是不是好處多多。
其它見解:
把克隆也給私有化
class test{ private static $instance; private function __construct(){ } private function __clone(){ } public static function getInstance(){ if (! self::$instance instanceof self ) { self::$instance = new self(); } return self::$instance; } }
更直覺方法:
#點擊開啟連結
/* 单例设计模式 (单态) 定义: 一个类 只能允许有 一个对象存在. 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>"; }
相關推薦:
以上是php單例模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
