AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程,有的又稱之為面向切面編程。在企業級開發中面向方面編程很有用。比如,我們在調用某些特定的方法之前,我們需要作一個日志記錄,調用方法之后,我們還需要一個日志記錄。我們先來看看不使用AOP,我們在PHP里怎么實現。
?php * 日志類 html' target='_blank'>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思想的解析
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答