首頁 >後端開發 >php教程 >關於PHP的AOP思想的解析

關於PHP的AOP思想的解析

不言
不言原創
2018-07-04 16:46:464023瀏覽

這篇文章主要介紹了關於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的作用,雖然其實現方式並不完美,但對於一般的使用已經足夠了。

<?php
class 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(&#39;未定义的方法:&#39; . $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 &#39;Exception &#39;.$e->getMessage();
}
/**
 * 总结:
 * 整个的实现思路其实很简单,关键就是客户端请求的对象不能直接实例化出来,
 * 而是利用工厂方法返回一个请求对象的包装对象,在包装对象内利用魔术方法来处理权限处理,日志记录等公共操作。
 * 这既是巧妙的地方,也是最有可能出问题的地方,因为客户端使用对象并不是它想象中的对象,
 * 而是一个包装后的对象,比如说,客户端通过getBizInstance()方法以为得到的对象是BIZ,
 * 但实际上它得到的是一个BIZ的包装对象AOP,这样的话,如果客户端进行一些诸如get_class()之类
 * 和对象类型相关的操作就会出错,当然,大多数情况下,客户端似乎不太会做类似的操作
 */

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

PHP工作原理的基礎

php產生短連接的方法

以上是關於PHP的AOP思想的解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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