项目地址:http://pecl.php.net/package/AOP
首先介绍下AOP编程,也叫做面向切面编程,是一种非侵入式编程的方法,采用外部注入的方式来取代嵌入代码。可以实现非常好的模块低耦合。
假设你的框架有一个 Frameworkd::init方法,功能是初始化框架资源。现在有db,template的初始化也需要在这个阶段执行,传统的做法就是只能修改 Framework::init在里面加入 db,template的方法调用。未来如果增加了新的模块,比如cache。那就需要修改Frameworkd::init的代码。这种做法显然是侵入性的。
当然也可以用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();
执行结果:
Calling doAdminStuff1
AOP[2] Run
AOP[1] Run
Calling doAdminStuff2
AOP[2] Run
AOP[1] Run
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。