描述觀察者的設計模式及其在PHP中的實現。
當受試者的狀態更改時,觀察者設計模式可以自動通知因對象。 1)它定義了對象之間的一對多依賴性; 2)受試者維護觀察者列表,並通過公共接口通知它們; 3)觀察者實施一種更新方法來對變化做出反應; 4)在PHP中,可以使用自定義主題和觀察者界面或內置的SPLSUBSUBEXT和SPLOBSERVER實現; 5)諸如新聞觸發更新之類的具體主題,而新聞渠道和社交媒體等具體觀察者對此做出了回應。這種模式可以促進寬鬆的耦合,支持動態觀察者管理並促進事件驅動的通信,使其非常適合需要脫鉤的實時更新的系統。
觀察者設計模式是一種行為設計模式,它允許對象(稱為主題)在其狀態更改時自動通知多個相關對象(稱為觀察者)。它在對象之間建立了一對多的依賴關係,因此當一個對象更改狀態時,其所有依賴者會自動通知和更新。

這種模式在事件驅動的系統中特別有用,例如GUI框架,實時數據提要或任何組件需要對其他組件的變化做出反應而不會緊密耦合的系統。
觀察者模式的關鍵組成部分
-
主題(可觀察)
維護觀察者列表,並提供附加,分離和通知它們的方法。 觀察者
定義對象的接口,該接口應通知主題的更改。-
混凝土主題
狀態改變並通知觀察者的實際對象。 混凝土觀察者
實現觀察者界面並對主題的更新做出反應。
PHP實施
PHP提供了一個稱為SplObserver
和SplSubject
(標準PHP庫的一部分)的內置接口,可用於實現觀察者模式。另外,您可以定義自己的接口以進行更多控制。
這是一個使用自定義接口的實踐示例:
步驟1:定義主題接口
接口主題{ 公共功能附件(觀察者$觀察者); 公共功能分離(觀察者$觀察者); 公共功能通知(); }
步驟2:定義觀察者接口
接口觀察者{ 公共功能更新(主題$主題); }
步驟3:實施具體主題
課堂新聞業實施主題{ 私人$ observers = []; 私人$ News =''; 公共功能附件(觀察者$ observer){ $ this->觀察者[] = $ observer; } 公共功能分離(觀察者$ observer){ $ this-> observers = array_filter( $ this->觀察者, fn($ obs)=> $ obs! == $觀察者 ); } 公共功能通知(){ foreach($ this->觀察者為$ observer){ $ observer-> update($ this); } } 公共功能setNews($ news){ $ this-> news = $新聞; $ this-> notify(); //自動通知所有觀察者 } 公共功能getNews(){ 返回$ this->新聞; } }
步驟4:實施具體觀察者
班級新聞渠道實現觀察者{ 私人$ News =''; 公共功能更新(主題$主題){ if($ objective instance of Newsagency){ $ this-> news = $主題 - > getNews(); Echo“新聞渠道收到了新聞:”。 $ this->新聞。 “ \ n”; } } }
另一個觀察者:
班級社交媒體實現觀察者{ 公共功能更新(主題$主題){ if($ objective instance of Newsagency){ $ news = $ objection-> getNews(); Echo“ SocialMediaFeed發布更新:\“ $ News \” \ n“”; } } }
步驟5:用法示例
$ agention = new Newsagency(); $ channel1 = new NewsChannel(); $ channel2 = new NewsChannel(); $ socialfeed = new SocialMediaFeed(); $ agention->附件($ channel1); $ agention->附件($ channel2); $ agention->附件($ socialfeed); $ agention-> setnews(“破裂:php 8.4發布!”); // 輸出: // NewsChannel收到新聞:破裂:PHP 8.4發布! // NewsChannel收到新聞:破裂:PHP 8.4發布! // SocialMediaFeed發布了更新:“破壞:PHP 8.4發布!” $ agention-> distach($ channel2); $ agention-> setNews(“更新:可用的新觀察者模式教程。”); // 輸出: // NewsChannel收到的新聞:更新:新觀察者模式教程可用。 // SocialMediaFeed發布了更新:“可用的新觀察者模式教程。”
好處
- 鬆散的耦合:主題和觀察者沒有緊密耦合;它們僅取決於抽象。
- 動態關係:可以在運行時添加或刪除觀察者。
- 廣播通信:一個對象的更改可以觸發許多其他對象的更新,而不知道它們是誰。
內置SPL支持(替代方案)
PHP還提供SplSubject
和SplObserver
。您可以這樣使用它們:
類mySubject instrument \ splSubject { 私人$ observers = []; 私人$狀態; 公共功能附加(\ splobserver $ observer){ $ this->觀察者[] = $ observer; } 公共功能分離(\ splobserver $ observer){ $ this-> observers = array_filter($ this->觀察者,fn($ o)=> $ o!== $ observer); } 公共功能通知(){ foreach($ this->觀察者為$ observer){ $ observer-> update($ this); } } 公共功能setState($ state){ $ this-> state = $ state; $ this-> notify(); } 公共功能getState(){ 返回$ this-> state; } }
和一個觀察者:
類myobserver blint \ splobserver { 公共功能更新(\ splsubject $主題){ 迴聲“觀察者已通知。新狀態:”。 $主題 - > getState()。 “ \ n”; } }
何時使用
- 實施事件處理系統。
- 解耦代碼,其中一個組件的變化會影響其他組件。
- 構建發布訂閱模型。
PHP中的觀察者模式通過減少直接依賴性來促進可維護和可擴展的代碼。無論是使用自定義接口還是SPL,核心想法都保持不變:自動通知因對象。
基本上,這是一種簡潔的說法:“嘿,當某些事情發生變化時,讓每個人都知道 - 而無需他們不斷檢查。”
以上是描述觀察者的設計模式及其在PHP中的實現。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

phparrayshandledatAcollectionsefefityIndexedorassociativuctures; hearecreatedWithArray()或[],訪問decessedviakeys,modifybyAssignment,iteratifybyAssign,iteratedwithforeach,andManipulationUsfunsionsFunctionsLikeCountLikeCountLikeCountLikeCountLikecount()

$_COOKIEisaPHPsuperglobalforaccessingcookiessentbythebrowser;cookiesaresetusingsetcookie()beforeoutput,readvia$_COOKIE['name'],updatedbyresendingwithnewvalues,anddeletedbysettinganexpiredtimestamp,withsecuritybestpracticesincludinghttponly,secureflag
![您目前尚未使用附上的顯示器[固定]](https://img.php.cn/upload/article/001/431/639/175553352135306.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Ifyousee"YouarenotusingadisplayattachedtoanNVIDIAGPU,"ensureyourmonitorisconnectedtotheNVIDIAGPUport,configuredisplaysettingsinNVIDIAControlPanel,updatedriversusingDDUandcleaninstall,andsettheprimaryGPUtodiscreteinBIOS/UEFI.Restartaftereach

UnedateTimeFordateSinphp:createWithNewDateTime(),formatwithformat(),modifyviaadd()ormodify(),settimezoneswithdateTimeZone,and compareusingoperatorSordiff()togetIntervals。

public成員可被任意訪問;2.private成員僅類內可訪問;3.protected成員可在類及子類中訪問;4.合理使用可提升代碼安全與可維護性。

TheOilPaintfilterinPhotoshopisgreyedoutusuallybecauseofincompatibledocumentmodeorlayertype;ensureyou'reusingPhotoshopCS6orlaterinthefulldesktopversion,confirmtheimageisin8-bitperchannelandRGBcolormodebycheckingImage>Mode,andmakesureapixel-basedlay

使用MySQLi面向對象方式:建立連接,預處理UPDATE語句,綁定參數,執行並檢查結果,最後關閉資源。 2.使用MySQLi過程方式:通過函數連接數據庫,準備語句,綁定參數,執行更新,處理錯誤後關閉連接。 3.使用PDO:通過PDO連接數據庫,設置異常模式,預處理SQL,綁定參數,執行更新,用try-catch處理異常,最後釋放資源。始終使用預處理語句防止SQL注入,驗證用戶輸入,及時關閉連接。

ThePHPrequestlifecyclebeginswhenaclientsendsanHTTPrequesttoawebserver,whichthenreceivesandparsesittodeterminetherequestedresourceandmethod.2.TheserverroutestherequesttothePHPprocessoreitherviaembeddedmoduleslikemod_phporthroughPHP-FPMusingtheFastCGIp
