PHP使用觀察者模式處理異常信息的方法詳解
本文實(shí)例講述了PHP使用觀察者模式處理異常信息的方法。分享給大家供大家參考,具體如下:
異常信息的捕獲對編程測試有著重要的意義,這里結(jié)合觀察者模式,探索如何處理異常信息。
關(guān)于觀察者模式,如果還沒有接觸過的話,博客園有很多優(yōu)秀的博友做了詳細(xì)的 解釋。筆者覺得,所謂觀察者模式,必須有兩個(gè)重要組成部分:一個(gè)主題對象,多個(gè)觀察者。在使用的時(shí)候,我們可以將觀察者像插頭一樣插到主題對象這個(gè)插座上,利用主題對象完成相應(yīng)功能。
既然觀察者要作為插頭,必須要有一個(gè)統(tǒng)一的口徑才能插到相同的插座上,因而先定義一個(gè)接口,Exception_Observer.php:
<?php /** * 定義的規(guī)范 */ interface Exception_Observer{ public function update(Observer_Exception $e); } ?>
相對于眾多觀察者,我們首先應(yīng)該關(guān)注唯一的主題對象,Observer_Exception.php:
<?php class Observer_exception extends Exception{ public static $_observers=array(); public static function attach(Exception_Observer $observer){ self::$_observers[]=$observer; } public function __construct($message=null,$code=0){ parent::__construct($message,$code); $this->notify(); } public function notify(){ foreach (self::$_observers as $observer) { $observer->update($this); } } }
我們可以清楚地看到,靜態(tài)變量$_observers用來放置插入的觀察者,notify()用來通知所有觀察者對象。
這里需要注意 $observer->update($this);
里面 $this
的用法,很多初學(xué)者會(huì)感到“原來 $this
也可以這么用啊”。
一個(gè)小問題: $_observers
不是靜態(tài)變量可不可以? 這個(gè)問題我們后面回答。
定義兩個(gè)觀察者,原則上實(shí)現(xiàn)接口所定義的功能。
Email_Exception_Observer.php:
class Emailing_Exception_Observer implements Exception_Observer{ protected $_email="huanggbxjp@sohu.com"; function __construct($email=null) { if ($email!==null&&filter_var($email,FILTER_VALIDATE_EMAIL)) { $this->_email=$email; } } public function update(Observer_Exception $e){ $message="時(shí)間".date("Y-m-d H:i:s").PHP_EOL; $message.="信息".$e->getMessage().PHP_EOL; $message.="追蹤信息".$e->getTraceAsString().PHP_EOL; $message.="文件".$e->getFile().PHP_EOL; $message.="行號(hào)".$e->getLine().PHP_EOL; error_log($message,1,$this->_email); } }
Logging_Exception_Observer.php:
<?php class Logging_Exception_Observer implements Exception_Observer { protected $_filename="F:/logException.log"; function __construct($filename=null) { if ($filename!==null&&is_string($filename)) { $thvis->_filename=$filename; } } public function update(Observer_Exception $e){ $message="時(shí)間".date("Y-m-d H:i:s").PHP_EOL; $message.="信息".$e->getMessage().PHP_EOL; $message.="追蹤信息".$e->getTraceAsString().PHP_EOL; $message.="文件".$e->getFile().PHP_EOL; $message.="行號(hào)".$e->getLine().PHP_EOL; error_log($message,3,$this->_filename); } }
設(shè)計(jì)完所有該有的主體對象和插件,我們做個(gè)小小的測試:
<?php require 'Exception_Observer.php'; require 'Observer_Exception.php'; require 'Logging_Exception_Observer.php'; require 'Emailing_Exception_Observer.php'; Observer_Exception::attach(new Logging_Exception_Observer()); class MyException extends Observer_Exception{ public function test(){ echo 'this is a test'; } public function test1(){ echo "我是自定義的方法處理這個(gè)異常"; } } try { throw new MyException("出現(xiàn)異常,記錄一下"); } catch (MyException $e) { echo $e->getMessage(); echo "<ht/>"; } ?>
本實(shí)例首先先加載觀察者,其后進(jìn)行其他操作?;氐缴厦嫣岢龅膯栴}, $_observers
可以不是靜態(tài)變量嗎?答案是不可以。如果 $_observers
不是靜態(tài)變量,加載觀察者的行為對后續(xù)操作沒有影響。static
讓所有實(shí)例成員共享某個(gè)變量。即便類繼承也同樣有效。有興趣的可以繼續(xù)探索下static的神奇作用吧。
本例顯示輸出與一般情況無異,但不同的是已在自定義的文件下生成了相應(yīng)的日志。雖然最后實(shí)現(xiàn)的功能再簡單不過,很多人甚至可以用更少的代碼更簡單的方法實(shí)現(xiàn),但是,在實(shí)現(xiàn)更加復(fù)雜系統(tǒng)的情況下,觀察者模式給我們帶來很大方便。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP使用微信開發(fā)模式實(shí)現(xiàn)搜索已發(fā)送圖文及匹配關(guān)鍵字回復(fù)的方法
這篇文章主要介紹了PHP使用微信開發(fā)模式實(shí)現(xiàn)搜索已發(fā)送圖文及匹配關(guān)鍵字回復(fù)的方法,涉及php針對微信json格式數(shù)據(jù)的解析與正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Drupal7 form表單二次開發(fā)要點(diǎn)與實(shí)例
這篇文章主要介紹了Drupal7 form表單二次開發(fā)要點(diǎn)與實(shí)例,解決了經(jīng)常使用的Form表單提交后跳轉(zhuǎn)問題,需要的朋友可以參考下2014-03-03PHP寫的求多項(xiàng)式導(dǎo)數(shù)的函數(shù)代碼
PHP寫的求多項(xiàng)式導(dǎo)數(shù)的函數(shù)代碼,需要的朋友可以參考下2012-07-07探討PHP中this,self,parent的區(qū)別詳解
本篇文章是對PHP中this,self,parent的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法,以實(shí)例形式分別介紹了php數(shù)組與字符串的轉(zhuǎn)換技巧,非常簡單實(shí)用,需要的朋友可以參考下2015-08-08