PHP實現AOP的基礎

來源:互聯網
上載者:User
這篇文章主要介紹了關於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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.