這篇文章主要介紹了關於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方面也會更加強大。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!