關於PHP的AOP思想的解析

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP的AOP思想的解析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

故事背景:

問題:

在傳統的OOP(物件導向編程:Object-Oriented Programming)思想裡,一般把應用程式分解成若干個的對象,強調高內聚,弱耦合,從而提高應用程式的模組化程度,但是在處理某些問題的時候,OOP會顯得不夠靈活,

比如說,應用程式裡很多商務邏輯都要在操作之初進行“許可權檢查”,在操作之後進行“日誌記錄”,如果直接把處理這些操作的代碼加入到每個模組中,那麼無疑破壞了OOP的“單一職責”原則,模組的可重用性會大大降低,

這時候傳統的OOP設計往往採取的策略是加入相應的代理(Proxy)層來完成系統的功能要求,但這樣的處理明顯使系統整體增加了一個層次的劃分,複雜性也隨之增加,從而給人過於厚重的感覺。

解決方案:

正是為了處理這樣的問題,AOP(面向方面編程:Aspect-Oriented Programming)思想應運而生了,假設把應用程式想成一個立體結構的話,OOP的利刃是縱向切入系統,把系統劃分為很多個模組(如:使用者模組,文章模組等等),而AOP的利刃是橫向切入系統,提取各個模組可能都要重複操作的部分(如:許可權檢查,日誌記錄等等)。由此可見,AOP是OOP的一個有效補充。

就目前的PHP來說,還沒有一個完整的AOP內建實現,雖然出現了RunKit,但一直都以BETA的狀態呆在PECL項目裡,估計很長時間內不太可能成為PHP的預設設定。那是不是AOP在PHP裡就破滅了呢?當然不是,因為我們有__get(),__set(),__call()等魔術方法,合理使用這些方法可以為我們實現某種程度的“准AOP”能力,之所以說是准AOP,是因為單單從實現上來看,稱其為AOP有些牽強,但是從效果上來看,又部分實現了AOP的作用,雖然其實現方式並不完美,但對於一般的使用已經足夠了。

<?phpclass BIZ{     public function foobar($num)     {               print_r($num);               echo "\n商務邏輯 do something";     }}class AOP{     private $instance;     public function __construct($instance){          $this->instance = $instance;     }          public function __call($method,$argument) {               if (!method_exists($this->instance, $method)) {                    throw new Exception('未定義的方法:' . $method);          }                    echo "\n許可權檢查"; //--------------AOP          $callBack = array($this->instance,$method);                    $return = call_user_func($callBack,$argument);                    echo "\n日誌記錄"; //--------------AOP          return $return;     }}class Factory{     public static function getBizInstance()     {               return new AOP(new BIZ());     }}try {     $obj = Factory::getBizInstance();      $obj->foobar(3);} catch (Exception $e) {     echo 'Exception '.$e->getMessage();}
/** * 總結: * 整個的實現思路其實很簡單,關鍵就是用戶端請求的對象不能直接執行個體化出來, * 而是利用Factory 方法返回一個請求對象的封裝對象,在封裝對象內利用魔術方法來處理許可權處理,日誌記錄等公用操作。 * 這既是巧妙的地方,也是最有可能出問題的地方,因為用戶端使用對象並不是它想象中的對象, * 而是一個封裝後的對象,比如說,用戶端通過getBizInstance()方法以為得到的對象是BIZ, * 但實際上它得到的是一個BIZ的封裝對象AOP,這樣的話,如果用戶端進行一些諸如get_class()之類 * 和物件類型相關的操作就會出錯,當然,大多數情況下,用戶端似乎不太會做類似的操作 */

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注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.