詳解 PHP 中的三大經典模式
單例模式
單例模式的意義:
作為物件的建立模式,單例模式確保某一個類別只有一個實例,而且自行實例化並向整個系統全域提供這個實例。它不會建立實例副本,而是會向單例類別內部儲存的實例傳回一個參考。
單例模式的三個要素:
1. 保存類別唯一實例的靜態變數。
2. 建構子和複製函式必須是私有的,放在外部去實例化,這樣就不存在單例模式的意義。
3. 提供一個可供外部存取的公共靜態方法,這個方法傳回該類別的唯一實例。
單例模式的意義:
在PHP 中的應用主要在於資料庫應用, 所以一個應用程式中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的new 作業消耗的資源。而不完全是系統資源的節省, 可以避免重複實例化,因為 PHP 每次實例化一個類別之後都會清理掉對應的資源,當再次使用的時候又會在重新去實例化一次。
單例模式使用的場景:
1. 資料庫操作,減少資料路的 new 操作,進而減少記憶體資源和系統資源的消耗。
2. 設定資源的共享,在一個系統中,設定資源都是全域的,使用單例模式也可以減少每次去讀取組態帶來的記憶體和系統資源的消耗。
程式碼示範:
<?php class Single { public static $attribute = ''; public static $instance = ''; private function __construct($attribute = '个人技术') { self::$attribute = $attribute; } public static function getInstance($attribute = '我是编程浪子走四方1') { if (!(self::$instance instanceof self)) self::$instance = new self($attribute); return self::$instance; } }
單例模式與非單一範例模式的差異:
class Single { public function index() { return ''; } } $single1 = new Single(); $single2 = new Single(); var_dump($single1); var_dump($single2); if ($single2 === $single1) { echo "是同一个对象"; } else { echo "不是同一个对象"; } // object(Single)#1 (0) { // } // object(Single)#2 (0) { // } // 不是同一个对象 class Single2 { // 1.声明一个静态属性,用户保存类的实例 public static $instance; //3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例) private function __construct() { } // 2.声明一个静态的公共方法,用户外部调用本类的实例 public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self; } return self::$instance; } //3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例) private function __clone() { } } $singleDemo1 = Single2::getInstance(); $singleDemo2 = Single2::getInstance(); var_dump($singleDemo1->getInstance()); var_dump($singleDemo2->getInstance()); if ($singleDemo1 === $singleDemo2) { echo "是同一个对象"; } else { echo "不是同一个对象"; } // object(Single2)#3 (0) { // } // object(Single2)#3 (0) { // } // 是同一个对象
工廠模式
工廠模式的有意義:
負責產生其他物件的方法。簡單的描述就是透過一個工廠類,去實例化其他類別或方法。
工廠模式的意義:
透過使用工廠模式,減少因為多處 new 同一個類,當這個類別發生變法時,則需要多處修改。
程式碼示範:
<?php class Factor { public static function createDB() { echo '我生产了一个DB实例'; return new DB; } } class DB { public function __construct() { echo __CLASS__ . PHP_EOL; } } $db = Factor::createDB();
註冊樹模式
#註冊數的意義:
註冊樹就是將多個物件註冊在一個物件池中,當我們需要使用時,直接從物件池取得即可。
註冊數模式的優點:
單例模式解決的是如何在整個專案中建立唯一物件實例的問題,工廠模式解決的是如何不通過new 建立實例物件的方法。
那麼註冊樹模式想解決什麼問題呢?在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的限制。
首先,單例模式建立唯一物件的過程本身還有一種判斷,就是判斷物件是否存在。存在則傳回對象,不存在則建立對象並返回。
每次建立實例物件都要存在這麼一層判斷。
工廠模式更多考慮的是擴充維護的問題。
總的來說,單例模式和工廠模式可以產生更合理的物件。怎麼方便呼叫這些物件呢?
而且在專案內如此建立的對象好像散兵游勇一樣,不便統籌管理安排啊。因 而,註冊樹模式應運而生。
不管你是透過單例模式還是工廠模式還是二者結合產生的對象,都統統給我 「插到」 註冊樹上。我用某個物件的時候,直接從註冊樹上取 一下就好。
這和我們使用全域變數一樣的方便實用。而且註冊樹模式也為其他模式提供了一個非常好的想法。
程式碼示範:
<?php /** * 单例模式 */ class Single { public static $attribute = ''; public static $instance = ''; private function __construct($attribute = '个人技术') { self::$attribute = $attribute; } public static function getInstance($attribute = '个人技术1') { if (!(self::$instance instanceof self)) self::$instance = new self($attribute); return self::$instance; } } /** * 工厂模式 */ class Factory { public static function createObj() { return Single::getInstance('个人技术'); } } /** * 注册模式 * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找. * 需要如下几个操作: * 1.注册 * 2.存放对象池 * 3.获取 * 4.销毁 */ Class Register { // 用一个数组来当做对象池,键当做对象别名,值存储具体对象 public static $objTree = []; // 将对象放在对象池 public static function set($key, $val) { return self::$objTree[$key] = $val; } // 通过对象别名在对象池中获取到对象别名 public static function get($key) { return self::$objTree[$key]; } // 通过对象别名将对象从对象池中注销 public static function _unset($key) { unset(self::$objTree[$key]); } } Register::set('single', Factory::createObj()); $single = Register::get('single'); print_r($single); echo $single::$attribute;
以上是詳解 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是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

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

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適用於多種應用,如數據分析和機器學習。
