搜尋
首頁後端開發php教程php模式設計之 單例模式

  模式設計是什麼?初學者一開始會被這高大上的名稱給唬住。而對於有豐富程式經驗的老鳥來說,模式設計又是無所不在。很多接觸的框架是基於各種模式設計而形成的。 簡單說,在寫程式碼的過程中一開始往往接觸的是面向過程的,簡單的基礎的程式設計。這時候我們往往追求的是程式碼能夠實現某項功能就萬事大吉。管他程式碼多麼冗餘,管他程式碼是否可重用,管他效率如何,能實現功能就好。但是,真正應用於實際的,更被大家採納的是那些高效的,可重用的,便於團隊開發的程式碼。基於這些因素,你不能像練手一樣,隨便命名函數名,隨便放腳本。模式設計告訴是給人們組織程式碼提供一個思路,實現可重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 

  在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。

什麼是單例模式?

  根據這個名稱,我們很容易了解到,單例模式指的是整個應用中只有一個物件實例的設計模式。

為什麼要用單例模式?

php常常和資料庫打交道,如果在應用中如果頻繁建立連接對象,進行new操作的話,會消耗大料的系統記憶體資源,這並不是我們希望看到的。再則,在團隊合作專案中,單例模式可以有效避免不同程式設計師new自己的對象,造成人為的系統消耗。

 如何建立單例模式?

  在看到這個問題的時候,相信優秀的程式設計師很可能自己試著根據要求去創建單例模式,而不是坐等前人的經驗。有別於其他博友告訴你什麼樣的模式是單例模式,我人更願意和有物件導向程式設計基本經驗的你考慮一下如何自己建立單例模式。

  我們先從題目出發,單例模式是只有一個物件實例的設計模式。這一點是很讓人蛋疼的。我們平常創建的類別不是能創建很多物件的,就是不能創建物件的(抽象類別)。要建立物件需要有類別這是必須的,而且不能是抽象類別。這個類別要防止別人可以多次創建函數。我們自然而然地考慮到了從構造函數入手。但是,每次new操作都會呼叫建構函數,也就是會多次建立物件實例。這和我們設計初衷相悖了。在此務必申明建構函式為private或protected這樣才能解決這個問題。

  建構子被申明為private或protected這注定無法透過new的方法建立實例物件了。而我們發現,經過這一步處理後,解決問題的前景變得明朗起來?為什麼呢?既然無法透過new方法建立物件實例,那麼我們只能透過類別內的方法來建立物件實例了。 這時候我們面臨一個有趣的先有雞還是先有蛋的問題。我們往往往往是創建了物件後才呼叫物件的方法,而此時需要呼叫類別裡面的方法來建立物件。不受是否創建物件影響都能呼叫的方法的解決方案毋庸置疑那就是利用關鍵字--static。

  在類別內建立靜態方法完成完成什麼工作呢?回歸主題:確保只建立一個實例物件。如何確保只有一個?這很簡單,if判斷一下。存在的話直接返回,不存在自己創建一個嘛。當然這個實例物件是類別的靜態屬性。至此,單例模式要求的功能實現完成。真的完成了麼?還不算~如果有個類別繼承本類,將構造方法申明為public那不又壞事兒了?那有必要在構造方法前面加final關鍵字了。

  最後貼上單例模式代碼,程式碼解釋都在上面了~~

<span>php
</span><span>class</span><span> Single{
    </span><span>public</span><span>$hash</span><span>;
    </span><span>static</span><span>protected</span><span>$ins</span>=<span>null</span><span>;
    </span><span>final</span><span>protected</span><span>function</span><span> __construct(){
        </span><span>$this</span>->hash=<span>rand</span>(1,9999<span>);
    }

    </span><span>static</span><span>public</span><span>function</span><span> getInstance(){
        </span><span>if</span> (self::<span>$ins</span><span> instanceof self) {
            </span><span>return</span> self::<span>$ins</span><span>;
        }
        self</span>::<span>$ins</span>=<span>new</span><span> self();
        </span><span>return</span> self::<span>$ins</span><span>;
    } 
}</span>

  本身單例模式並不復雜,但需要深入理解。很多初學者依舊會感嘆:臥槽,構造方法原來不一直是public啊~臥槽還可以不透過new創建對像啊~其實筆者想說,不管構造方法被申明為public,private還是protected,最終創建對象的時候都會呼叫。一直是new創建對象實例,單例模式也用new創建對象,只是換個地方而已,從類別外到類別內。

  最後對研究出各種精妙的模式設計的程式設計師表示拜服~~

以上就介紹了php模式設計之 單例模式,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
使用PHP發送電子郵件的最佳方法是什麼?使用PHP發送電子郵件的最佳方法是什麼?May 08, 2025 am 12:21 AM

ThebestapproachforsendingemailsinPHPisusingthePHPMailerlibraryduetoitsreliability,featurerichness,andeaseofuse.PHPMailersupportsSMTP,providesdetailederrorhandling,allowssendingHTMLandplaintextemails,supportsattachments,andenhancessecurity.Foroptimalu

PHP中依賴注入的最佳實踐PHP中依賴注入的最佳實踐May 08, 2025 am 12:21 AM

使用依賴注入(DI)的原因是它促進了代碼的松耦合、可測試性和可維護性。 1)使用構造函數注入依賴,2)避免使用服務定位器,3)利用依賴注入容器管理依賴,4)通過注入依賴提高測試性,5)避免過度注入依賴,6)考慮DI對性能的影響。

PHP性能調整技巧和技巧PHP性能調整技巧和技巧May 08, 2025 am 12:20 AM

phpperformancetuningiscialbecapeitenhancesspeedandeffice,whatevitalforwebapplications.1)cachingwithapcureduccureducesdatabaseloadprovesrovessetimes.2)優化

PHP電子郵件安全性:發送電子郵件的最佳實踐PHP電子郵件安全性:發送電子郵件的最佳實踐May 08, 2025 am 12:16 AM

ThebestpracticesforsendingemailssecurelyinPHPinclude:1)UsingsecureconfigurationswithSMTPandSTARTTLSencryption,2)Validatingandsanitizinginputstopreventinjectionattacks,3)EncryptingsensitivedatawithinemailsusingOpenSSL,4)Properlyhandlingemailheaderstoa

您如何優化PHP應用程序的性能?您如何優化PHP應用程序的性能?May 08, 2025 am 12:08 AM

TOOPTIMIZEPHPAPPLICITIONSFORPERSTORANCE,USECACHING,數據庫imization,opcodecaching和SererverConfiguration.1)InlumentCachingWithApcutCutoredSatfetchTimes.2)優化的atabasesbasesebasesebasesbasesbasesbaysbysbyIndexing,BeallancingAndWriteExing

PHP中的依賴注入是什麼?PHP中的依賴注入是什麼?May 07, 2025 pm 03:09 PM

依賴性注射inphpisadesignpatternthatenhancesFlexibility,可檢驗性和ManiaginabilybyByByByByByExternalDependencEctenceScoupling.itallowsforloosecoupling,EasiererTestingThroughMocking,andModularDesign,andModularDesign,butquirscarecarefulscarefullsstructoringDovairing voavoidOverOver-Inje

最佳PHP性能優化技術最佳PHP性能優化技術May 07, 2025 pm 03:05 PM

PHP性能優化可以通過以下步驟實現:1)在腳本頂部使用require_once或include_once減少文件加載次數;2)使用預處理語句和批處理減少數據庫查詢次數;3)配置OPcache進行opcode緩存;4)啟用並配置PHP-FPM優化進程管理;5)使用CDN分發靜態資源;6)使用Xdebug或Blackfire進行代碼性能分析;7)選擇高效的數據結構如數組;8)編寫模塊化代碼以優化執行。

PHP性能優化:使用OpCode緩存PHP性能優化:使用OpCode緩存May 07, 2025 pm 02:49 PM

opcodecachingsimplovesphperforvesphpermance bycachingCompiledCode,reducingServerLoadAndResponSetimes.1)itstorescompiledphpcodeinmemory,bypassingparsingparsingparsingandcompiling.2)useopcachebachebachebachebachebachebachebysettingparametersinphametersinphp.ini,likeememeryconmorysmorysmeryplement.33)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。