首頁  >  文章  >  後端開發  >  PHP實作AOP的基礎

PHP實作AOP的基礎

不言
不言原創
2018-07-04 17:04:452898瀏覽

這篇文章主要介紹了關於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實作AOP的基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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