項目地址: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