這篇文章主要介紹了關於PHP實現AOP的基礎,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程,有的又稱之為面向切面編程。在企業級開發中面向方面編程很有用。例如,我們在呼叫某些特定的方法之前,我們需要先作一個日誌記錄,在呼叫方法之後,我們還需要一個日誌記錄。我們先來看看不使用AOP,我們在PHP裡怎麼實現。
<?php /** * 日志类 */ class SystemLog { function beforeLog() { // write before log } function afterLog() { // write after log } } /** * 新闻类 */ class News extends SystemLog { function add() { $this->beforeLog(); // add news $this->afterLog(); } function delete() { // delete news } }
我們定義一個日誌類,類別包含兩個方法beforeLog()和afterLog(),用於記錄方法呼叫前和呼叫後的日誌,接著我們定義了新聞類,新聞類繼承日誌類,要在呼叫add()方法前後完成日誌記錄,我們只有在add()方法內部呼叫beforeLog()和afterLog()兩個方法。雖然我們實作在呼叫add()方法前/後記錄日誌,但這樣的程式碼在OOP程式設計中一點也不優雅,也違背了「弱耦合,強內聚」的思想,因為News類別下的add( )方法只是應該做新增新聞這件事情,然後我們在add()方法中又記了日誌,另外如果我們需要為很多方法增加日誌記錄功能,那麼將會呼叫很多次beforeLog()和afterLog( )方法,帶來很多重複程式碼。
在PHP5中,如果呼叫未定義的方法,將自動呼叫_call()方法。利用PHP5的這個特點,我們可以在_call()方法中實現AOP編程,這種AOP編程只是一個AOP雛形,沒有Java那麼強大。
<?php /** * 日志类 */ class SystemLog { function _call($method,$args) { $method = "_$method"; // 在要调用的方法名前加‘_’,$method为要调用的方法名 // write before log $return = call_user_func_array(array($this, $method), $args); // write after log return $return; } } /** * 新闻类 */ class News extends SystemLog { function _add() { // add news } function delete() { // delete news } }
新聞類還是繼承日誌類,需要注意的是我們在add()方法前加了'_',add()方法中並沒有任何日誌記錄相關的程式碼。
$news = new News(); $news->add();
呼叫News類別中的add()方法,注意重寫後的News類別中並沒有add()方法,只有_add()方法,這時PHP找不到add()方法則會自動呼叫_call()方法,_call()方法有兩個參數,第一個參數為被呼叫方法的名稱,第二個參數為被呼叫方法的參數,在_call()方法中先為被呼叫的方法名稱前加上'_',這裡,加入'_'後的方法後就變成了_add,_add()方法在News類別中是存在的,然後寫方法調用前日誌,接著使用call_user_func_array()函數執行前物件方法調用,方法調用完成再寫方法調用後日誌。
回顧一下,我們利用編程慣例和PHP5中調用未定義的方法將自動調用_call()方法的特性,實現了AOP,但這裡的AOP還只是雛形,功能還不夠強大,隨著PHP的發展,我相信未來的PHP在AOP方面也會更強大。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
#以上是PHP實作AOP的基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!