PHP-AOP擴展

項目地址:http://pecl.php.net/package/AOPphp

首先介紹下AOP編程,也叫作面向切面編程,是一種非侵入式編程的方法,採用外部注入的方式來取代嵌入代碼。能夠實現很是好的模塊低耦合。編程

假設你的框架有一個 Frameworkd::init方法,功能是初始化框架資源。如今有db,template的初始化也須要在這個階段執行,傳統的作法就是隻能修改 Framework::init在裏面加入 db,template的方法調用。將來若是增長了新的模塊,好比cache。那就須要修改Frameworkd::init的代碼。這種作法顯然是侵入性的。swoole

固然也能夠用hook list的方式來實現。在須要外部注入的地方加入一個hook list,遍歷執行外部注入的接口。但遠沒有AOP強大,並且還須要不斷加入hook list的遍歷點。框架

若是AOP編程的話,只須要外部注入一個函數,執行 Framework::init時,就會執行指定的代碼。函數

<?php
class MyServices
{
        public function doAdminStuff1 ()
        {
                //some stuff only the admin should do
                echo "Calling doAdminStuff1\n";
        }

        public function doAdminStuff2 ()
        {
                //some stuff only the admin should do
                echo "Calling doAdminStuff2\n";
        }
}

function adviceForDoAdmin ()
{
        echo "AOP[1] Run\n";
}

function adviceForDoAdmin2 ()
{
        echo "AOP[2] Run\n";
}
aop_add_after('MyServices->doAdmin*()', 'adviceForDoAdmin');
aop_add_after('MyServices->doAdmin*()', 'adviceForDoAdmin2');
$o = new MyServices;
$o->doAdminStuff1();
$o->doAdminStuff2();

執行結果:.net

Calling doAdminStuff1
AOP[2] Run
AOP[1] Run
Calling doAdminStuff2
AOP[2] Run
AOP[1] Run

轉自http://rango.swoole.com/archi...code

相關文章
相關標籤/搜索