使用觀察者模式處理異常信息,觀察者模式_PHP教程
Jul 13, 2016 am 09:44 AM使用觀察者模式處理異常信息,觀察者模式
異常信息的捕獲對編程測試有著重要的意義,這里結(jié)合觀察者模式,探索如何處理異常信息。
關(guān)于觀察者模式,如果還沒有接觸過的話,博客園有很多優(yōu)秀的博友做了詳細(xì)的 解釋。筆者覺得,所謂觀察者模式,必須有兩個重要組成部分:一個主題對象,多個觀察者。在使用的時候,我們可以將觀察者像插頭一樣插到主題對象這個插座上,利用主題對象完成相應(yīng)功能。
既然觀察者要作為插頭,必須要有一個統(tǒng)一的口徑才能插到相同的插座上,因而先定義一個接口,Exception_Observer.php:
<?<span>php </span><span>/*</span><span>* * 定義的規(guī)范 </span><span>*/</span> <span>interface</span><span> Exception_Observer{ </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>); } </span>?>
相對于眾多觀察者,我們首先應(yīng)該關(guān)注唯一的主題對象,Observer_Exception.php:
<?<span>php </span><span>class</span> Observer_exception <span>extends</span> <span>Exception</span><span>{ </span><span>public</span> <span>static</span> <span>$_observers</span>=<span>array</span><span>(); </span><span>public</span> <span>static</span> <span>function</span> attach(Exception_Observer <span>$observer</span><span>){ self</span>::<span>$_observers</span>[]=<span>$observer</span><span>; } </span><span>public</span> <span>function</span> __construct(<span>$message</span>=<span>null</span>,<span>$code</span>=0<span>){ parent</span>::__construct(<span>$message</span>,<span>$code</span><span>); </span><span>$this</span>-><span>notify(); } </span><span>public</span> <span>function</span><span> notify(){ </span><span>foreach</span> (self::<span>$_observers</span> <span>as</span> <span>$observer</span><span>) { </span><span>$observer</span>->update(<span>$this</span><span>); } } }</span>
我們可以清楚地看到,靜態(tài)變量$_observers用來放置插入的觀察者,notify()用來通知所有觀察者對象。
這里需要注意 $observer->update($this); 里面 $this 的用法,很多初學(xué)者會感到“原來 $this 也可以這么用啊”。
一個小問題: $_observers 不是靜態(tài)變量可不可以? 這個問題我們后面回答。
定義兩個觀察者,原則上實現(xiàn)接口所定義的功能。
Email_Exception_Observer.php:
<span>class</span> Emailing_Exception_Observer <span>implements</span><span> Exception_Observer{ </span><span>protected</span> <span>$_email</span>="huanggbxjp@sohu.com"<span>; </span><span>function</span> __construct(<span>$email</span>=<span>null</span><span>) { </span><span>if</span> (<span>$email</span>!==<span>null</span>&&filter_var(<span>$email</span>,<span>FILTER_VALIDATE_EMAIL)) { </span><span>$this</span>->_email=<span>$email</span><span>; } } </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){ </span><span>$message</span>="時間".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>; </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>; </span><span>$message</span>.="追蹤信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>; </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>; </span><span>$message</span>.="行號".<span>$e</span>->getLine().<span>PHP_EOL</span><span>; </span><span>error_log</span>(<span>$message</span>,1,<span>$this</span>-><span>_email); } }</span>
Logging_Exception_Observer.php:
<?<span>php </span> <span>class</span> Logging_Exception_Observer <span>implements</span><span> Exception_Observer { </span><span>protected</span> <span>$_filename</span>="F:/logException.log"<span>; </span><span>function</span> __construct(<span>$filename</span>=<span>null</span><span>) { </span><span>if</span> (<span>$filename</span>!==<span>null</span>&&<span>is_string</span>(<span>$filename</span><span>)) { </span><span>$thvis</span>->_filename=<span>$filename</span><span>; } } </span><span>public</span> <span>function</span> update(Observer_Exception <span>$e</span><span>){ </span><span>$message</span>="時間".<span>date</span>("Y-m-d H:i:s").<span>PHP_EOL</span><span>; </span><span>$message</span>.="信息".<span>$e</span>->getMessage().<span>PHP_EOL</span><span>; </span><span>$message</span>.="追蹤信息".<span>$e</span>->getTraceAsString().<span>PHP_EOL</span><span>; </span><span>$message</span>.="文件".<span>$e</span>->getFile().<span>PHP_EOL</span><span>; </span><span>$message</span>.="行號".<span>$e</span>->getLine().<span>PHP_EOL</span><span>; </span><span>error_log</span>(<span>$message</span>,3,<span>$this</span>-><span>_filename); } }</span>
設(shè)計完所有該有的主體對象和插件,我們做個小小的測試:
<?<span>php </span><span>require</span> 'Exception_Observer.php'<span>; </span><span>require</span> 'Observer_Exception.php'<span>; </span><span>require</span> 'Logging_Exception_Observer.php'<span>; </span><span>require</span> 'Emailing_Exception_Observer.php'<span>; Observer_Exception</span>::attach(<span>new</span><span> Logging_Exception_Observer()); </span><span>class</span> MyException <span>extends</span><span> Observer_Exception{ </span><span>public</span> <span>function</span><span> test(){ </span><span>echo</span> 'this is a test'<span>; } </span><span>public</span> <span>function</span><span> test1(){ </span><span>echo</span> "我是自定義的方法處理這個異常"<span>; } } </span><span>try</span><span> { </span><span>throw</span> <span>new</span> MyException("出現(xiàn)異常,記錄一下"<span>); } </span><span>catch</span> (MyException <span>$e</span><span>) { </span><span>echo</span> <span>$e</span>-><span>getMessage(); </span><span>echo</span> "<ht/>"<span>; } </span>?>
本實例首先先加載觀察者,其后進行其他操作?;氐缴厦嫣岢龅膯栴},?$_observers?可以不是靜態(tài)變量嗎?答案是不可以。如果?$_observers?不是靜態(tài)變量,加載觀察者的行為對后續(xù)操作沒有影響。static讓所有實例成員共享某個變量。即便類繼承也同樣有效。有興趣的可以繼續(xù)探索下static的神奇作用吧?!?/p>
本例顯示輸出與一般情況無異,但不同的是已在自定義的文件下生成了相應(yīng)的日志。雖然最后實現(xiàn)的功能再簡單不過,很多人甚至可以用更少的代碼更簡單的方法實現(xiàn),但是,在實現(xiàn)更加復(fù)雜系統(tǒng)的情況下,觀察者模式給我們帶來很大方便。
?

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

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

熱門話題

如何在Phalcon框架中使用事件管理器(EventManager)實現(xiàn)觀察者模式簡介:事件管理器(EventManager)是Phalcon框架中強大且靈活的核心功能之一。透過使用事件管理器,您可以輕鬆實現(xiàn)觀察者模式,以便在應(yīng)用程式中實現(xiàn)物件之間的鬆散耦合。本文將為您介紹如何使用Phalcon框架中的事件管理器實作觀察者模式,並提供對應(yīng)的程式碼範(fàn)例。步驟一

導(dǎo)言PHP設(shè)計模式是一組經(jīng)過驗證的解決方案,用於解決軟體開發(fā)中常見的挑戰(zhàn)。透過遵循這些模式,開發(fā)者可以創(chuàng)建優(yōu)雅、健壯和可維護的程式碼。它們可協(xié)助開發(fā)者遵循SOLID原則(單一職責(zé)、開放-封閉、Liskov替換、介面隔離和依賴反轉(zhuǎn)),從而提高程式碼的可讀性、可維護性和可擴展性。設(shè)計模式的類型有許多不同的設(shè)計模式,每種模式都有其獨特的目的和優(yōu)點。以下是一些最常用的php設(shè)計模式:單例模式:確保一個類別只有一個實例,並提供一種全域存取此實例的方法。工廠模式:建立一個對象,而不指定其確切類別。它允許開發(fā)者根據(jù)條件

1.什麼是PHP設(shè)計模式? PHP設(shè)計模式是預(yù)先定義的程式碼模板,旨在解決常見的軟體開發(fā)問題。它們提供了經(jīng)過驗證的解決方案,可以提高程式碼的可重複使用性、可維護性和可擴充性。 2.PHP設(shè)計模式的類型php中有許多不同的設(shè)計模式,每種模式都有其特定的用途。最常見的模式包括:單例模式:確保一個類別只有一個實例。工廠模式:根據(jù)傳給它的資料建立不同類型的物件。策略模式:允許程式在運行時更改其行為。觀察者模式:允許物件訂閱事件並在事件發(fā)生時獲得通知。 3.單例模式範(fàn)例classSingleInstance{private

提升Java程式設(shè)計技能:掌握適配器模式與觀察者模式的實作方式,需要具體程式碼範(fàn)例引言:在日常的軟體開發(fā)中,我們常常需要處理不同類別之間的相容性問題,同時也需要實作各種使用者介面的事件監(jiān)聽和處理。適配器模式和觀察者模式是兩種常用的設(shè)計模式,它們能夠有效地解決這些問題。本文將詳細(xì)介紹適配器模式和觀察者模式的實作方式,並提供具體的Java程式碼範(fàn)例,幫助讀者更好地理解。一、

Java框架中的觀察者模式透過介面和抽象類別定義行為(1);Subject和Observer類別實現(xiàn)管理和回應(yīng)行為(2);Subject提供訂閱和註銷方法,維護觀察者集合,並通知觀察者(3) 。範(fàn)例中,Subject管理觀察者並觸發(fā)事件(4),ConcreteObserver回應(yīng)事件(5)。

在現(xiàn)代軟體開發(fā)中,設(shè)計模式是一種被廣泛使用的概念。設(shè)計模式是存在於軟體系統(tǒng)中的通用解決方案,它們經(jīng)過測試和證明,可以幫助開發(fā)人員更有效率地建立複雜的軟體應(yīng)用程式。觀察者模式是其中一個很常見的設(shè)計模式,也是PHP開發(fā)者需要掌握的重要的概念。在本文中,我們將介紹觀察者模式的概念和實作方式,並示範(fàn)如何在PHP應(yīng)用程式中使用它。什麼是觀察者模式?觀察者模式是一種

PHP中的觀察者模式及其使用舉例解釋觀察者模式是一種軟體設(shè)計模式,用於在物件之間建立一對多的依賴關(guān)係。在該模式下,當(dāng)一個物件的狀態(tài)改變時,所有依賴它的物件都會收到通知並自動更新。在PHP程式設(shè)計中,觀察者模式是一種常用的設(shè)計模式,可以幫助我們優(yōu)化和簡化程式碼並提高程式碼的可讀性和可維護性。以下將介紹PHP中觀察者模式的基本方法和舉例解釋其使用。觀察者模式的基本方

深入分析PHP物件導(dǎo)向程式設(shè)計中的觀察者模式觀察者模式是一種常用的設(shè)計模式,用於在軟體系統(tǒng)中實現(xiàn)物件之間的鬆散耦合。它的核心思想是:一個物件(稱為被觀察者或主題)維護一個依賴它的物件清單(稱為觀察者),當(dāng)被觀察者的狀態(tài)改變時,它會自動通知所有的觀察者。透過這種方式,觀察者模式可以實現(xiàn)物件間的一對多關(guān)係,當(dāng)一個物件改變時,所有相關(guān)的物件都會被通知,並且能
