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