如果使用过 wordpress、discuz等开源程序的同学可能对插件不太陌生。下载一个插件,放进指定的文件夹,直接就可以使用。让程序有了极其强大的扩展性。
在这之前我们可能要了解一下 观察者模式 的原理,在这里我们需要一个观察者,把程序当成被观察的对象。当程序运行到一些程序允许使用插件的地方,则观察者向符合程序要求的插件发送通知。我把这个允许使用插件的地方叫做“钩子”。
首先我们编写程序的时候要注意,在需要后期进行扩展开发,或者修改的地方,我们应当留下这个“钩子”。比如用户登录,发帖,充值等地方。
$this->register_use('LOGIN_SUCCESS',$data);
然后在“钩子”函数中通知插件:此时程序运行到了 LOGIN_SUCCESS 这个地方。
function register_use($behavior,$data){
$handle=opendir(APP_FILE.'use/');
while($file=readdir($handle)) {
if (($file!=".")&&($file!="..")&&strstr($file,'.class.php')){
$classname=str_replace('.class.php','',$file);
$obj = new ReflectionClass($classname);
if($obj->hasMethod('notify')){
$instance =$obj->newInstanceArgs();
$obj->getmethod('notify')->invoke($instance,array('behavior'=>$behavior,'data'=>$data));
}
}
}
closedir($handle);
}
这里我们遍历了插件所在目录,并把符合我们要求的类挑选出来发送通知,因为使用了自动加载,所以没有引入文件这个操作,如果没有使用自动加载需要引入对应的文件。
然后在插件的父类中添加一个通知方法
function notify($data){
$behavior='use_'.strtolower($data['behavior']);
if(method_exists($this,$behavior)==true){
$this->$behavior($data['data']);
}
}
这样,我们就可以在插件目录下编写文件,只要继承父类或者自己编写一个通知方法,即可接收到程序运行时发出的通知。编写对应的代码即可在执行到钩子的时候运行。
function use_login_success(){
echo "use_login_success";
die();
}
然后我们登录测试一下
这时候我们发现,在登录处理完后触发了插件的方法。这时候,一个简单的插件就完成了。
发表评论
0 条评论