首頁 後端開發 php教程 使用觀察者模式處理異常訊息

使用觀察者模式處理異常訊息

Jul 30, 2016 pm 01:31 PM
exception message php

  異常訊息的捕捉對程式測試有著重要的意義,這裡結合觀察者模式,探索如何處理異常訊息。

  關於觀察者模式,如果還沒接觸過的話,博客園有很多優秀的博友做了詳細的 解釋。筆者覺得,所謂觀察者模式,必須有兩個重要組成部分:一個主題對象,多個觀察者。使用的時候,我們可以將觀察者像插頭一樣插到主題物件這個插座上,利用主題物件完成對應功能。

  既然觀察者要作為插頭,必須要有一個統一的口徑才能插到相同的插座上,因而先定義一個接口,Exception_Observer.php:

&lt;?<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>?&gt;
登入後複製

  相對於眾多觀察者,我們應該關注唯一觀察者的主題對象,Observer_Exception.php:

&lt;?<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>-&gt;<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>-&gt;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>&amp;&amp;filter_var(<span>$email</span>,<span>FILTER_VALIDATE_EMAIL)) {
            </span><span>$this</span>-&gt;_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>-&gt;getMessage().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="追踪信息".<span>$e</span>-&gt;getTraceAsString().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="文件".<span>$e</span>-&gt;getFile().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="行号".<span>$e</span>-&gt;getLine().<span>PHP_EOL</span><span>;
        </span><span>error_log</span>(<span>$message</span>,1,<span>$this</span>-&gt;<span>_email);
    }
}</span>
登入後複製

  Logging_Exception_Observer.php:

&lt;?<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>&amp;&amp;<span>is_string</span>(<span>$filename</span><span>)) {
            </span><span>$thvis</span>-&gt;_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>-&gt;getMessage().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="追踪信息".<span>$e</span>-&gt;getTraceAsString().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="文件".<span>$e</span>-&gt;getFile().<span>PHP_EOL</span><span>;
        </span><span>$message</span>.="行号".<span>$e</span>-&gt;getLine().<span>PHP_EOL</span><span>;
        </span><span>error_log</span>(<span>$message</span>,3,<span>$this</span>-&gt;<span>_filename);
    }
}</span>
登入後複製
&lt;?<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>-&gt;<span>getMessage();
    </span><span>echo</span> "&lt;ht/&gt;"<span>;    
}
</span>?&gt;
登入後複製

  本實例先載入觀察者,其後進行其他操作。回到上面提出的問題, 

$_observers

 可以不是靜態變數嗎?答案是不行。如果 

$_observers

 不是靜態變量,載入觀察者的行為對後續操作沒有影響。 static讓所有實例成員共用某個變數。即便類別繼承也同樣有效。有興趣的可以繼續探索下static的神奇作用。   本例顯示輸出與一般情況無異,但不同的是已在自訂的檔案下產生了對應的日誌。雖然最後實現的功能再簡單不過,很多人甚至可以用更少的程式碼更簡單的方法實現,但是,在實現更加複雜系統的情況下,觀察者模式給我們帶來很大方便。 以上就介紹了使用觀察者模式處理異常訊息,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles