aop:aspect oriented programming(面向切面程式設計)
字面解析:這裡的切面(aspect) 通常是指類的乙個例項方法,也就是說其實我們只要在類的乙個例項方法執行前或後面掛載前置或後置方法,有點像鉤子,其實目的都是一樣的,都是為了切分和擴充套件相應方法的功能,而不需要在原始方法裡面改動。
題外話:什麼是例項方法?就是類的方法前面沒有 static 關鍵字修飾,並且只有類的例項被建立(new)出來之後才可以使用的方法。
例項1:模擬資料庫的建立連線前後的動作
namespace mysql;
class database {
public function beforeconnect($connstr)
echo "before connectn";
public function afterconnect($connstr)
echo "after connectn";
public function connect($connstr)
$beforemethod = "before".ucfirst(__function__);
$args = func_get_args();
if(method_exists($this,$beforemethod)){
call_user_func_array([$this,$beforemethod], $args);
// todo: connect the database
echo "connectingn";
$aftermethod = "after".ucfirst(__function__);
if(method_exists($this,$aftermethod)){
call_user_func_array([$this,$aftermethod], $args);
$db = new database();
$db->connect("...");
執行結果如下:
before connect
connecting
after connect
例項2:安裝pecl c擴充套件,php aop,僅支援php5.5
假定有下面的類:
class myservices
public function doadminstuff1 ()
//some stuff only the admin should do
echo "calling doadminstuff1";
public function doadminstuff2 ()
//some stuff only the admin should do
echo "calling doadminstuff2";
我們接下來注入關注面:
aop_add_before('myservices->doadmin*()', 'advicefordoadmin');
其中advicefordoadmin:
function advicefordoadmin ()
if ((! isset($_session['user_type'])) || ($_session['user_type'] !== 'admin')) {
throw new exception('sorry, you should be an admin to do this');
其實上面的**作用很簡單,就是當我們呼叫 myservices 類下面的 doadmin 開頭的例項方法前先執行一遍 advicefordoadmin 方法,這個 c 擴充套件是不是挺神奇的。
AOP 切面程式設計
簡介 如果你很熟悉面向方面程式設計 aop 你就會知道給 增加 切面 可以使 更清晰並且具有可維護性。但是aop通常都依賴於第三方類庫或者硬編碼的.net特性來工作。雖然這些實現方式的好處大於它們的複雜程度,但是我仍然在尋找一種實現aop的更為簡單的方式,來試我的 更為清晰。我將它們單獨移出來,並命...
aop 面向切面程式設計
起源 研究人員就對物件導向思想的侷限性進行了分析。他們研究出了一種新的程式設計思想,借助這一思想或許可以通過減少 重複模組從而幫助開發人員提高工作效率。隨著研究的逐漸深入,aop也逐漸發展成一套完整的程式設計思想,各種應用aop的技術也應運而生。aop思想 定義乙個切面,在切面的縱向定義處理方法,處...
AOP面向切面程式設計
1 概念 面向切面程式設計,通過預編譯方式和執行期動態 實現程式功能的統一維護的一種技術。aop是oop的延續,利用aop可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率 2 作用 1.解耦,將通用性的功能模組 與業務 解耦 ioc專...