異常訊息的捕捉對程式測試有著重要的意義,這裡結合觀察者模式,探索如何處理異常訊息。
關於觀察者模式,如果還沒接觸過的話,博客園有很多優秀的博友做了詳細的 解釋。筆者覺得,所謂觀察者模式,必須有兩個重要組成部分:一個主題對象,多個觀察者。使用的時候,我們可以將觀察者像插頭一樣插到主題物件這個插座上,利用主題物件完成對應功能。
既然觀察者要作為插頭,必須要有一個統一的口徑才能插到相同的插座上,因而先定義一個接口,Exception_Observer.php:
<span>php </span><span>/*</span><span>* * 定义的规范 </span><span>*/</span><span>interface</span><span> Exception_Observer{ </span><span>public</span><span>function</span> update(Observer_Exception <span>$e</span><span>); } </span>?>
相對於眾多觀察者,我們應該關注唯一觀察者的主題對象,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>
我們可以清楚地看到,靜態變數$_observers用來放置插入的觀察者,notify()用來通知所有觀察者對象。
這裡要注意 $observer->update($this); 裡面 $this 。 一個小問題: $_observers
不是靜態變數可不可以? 這個問題我們後面回答。 定義兩個觀察者,原則上實現介面所定義的功能。 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>
<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("出现异常,记录一下"<span>); } </span><span>catch</span> (MyException <span>$e</span><span>) { </span><span>echo</span><span>$e</span>-><span>getMessage(); </span><span>echo</span> "<ht></ht>"<span>; } </span>?>本實例先載入觀察者,其後進行其他操作。回到上面提出的問題, $_observers 可以不是靜態變數嗎?答案是不行。如果 $_observers
不是靜態變量,載入觀察者的行為對後續操作沒有影響。 static讓所有實例成員共用某個變數。即便類別繼承也同樣有效。有興趣的可以繼續探索下static的神奇作用。 本例顯示輸出與一般情況無異,但不同的是已在自訂的檔案下產生了對應的日誌。雖然最後實現的功能再簡單不過,很多人甚至可以用更少的程式碼更簡單的方法實現,但是,在實現更加複雜系統的情況下,觀察者模式給我們帶來很大方便。 以上就介紹了使用觀察者模式處理異常訊息,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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