跟着辛星用PHP的反射机制来实现插件
我的博文的前一篇讲解了PHP的反射机制是怎么回事,如果读者还不清楚反射机制,可以搜索下或者看我的博文,都是不错的选择,我们开始讲解一下怎么用PHP来实现插件机制。所谓插件机制,就是我们定义一个接口,即我们定义一个interface,然后第三方插件就去实现这个interface,然后我们拿到了这个插件之后,去调用这个插件的功能,我们可以不知道这些插件的类名等信息,我们接下来就用反射机制去实现这个功能。
由于我只是简单的示例,所以我写的代码并不长,而且很简单,所以,大家既然理解了上面的步骤,那么就可以直接看源代码了,其中的注释还是蛮清楚的,如果读者有什么不清楚的,可以告诉我,我会认真回复的。
<?php /***我们定义好一个接口,叫做Ixin*/interface Ixin{ function msg();}/***某热心开发人员给我们写了一个插件类*/class Xin implements Ixin{ function msg(){ echo "辛星你好"; }}/***我们先搜索该插件类,并且判断它是否实现了msg方法*/function find(){ //定义描述插件的数组 $plugin = array(); foreach (get_declared_classes() as $class) { //实例化反射类的类 $reclass = new ReflectionClass($class); //判断它是否实现了接口Ixin if($reclass->implementsInterface('Ixin')){ $plugin[] = $reclass; } } return $plugin;}/***我们去调用该插件的msg方法*/function myexec(){ $arr = find(); foreach (find() as $plugin) { //判断该插件是否有方法msg if($plugin->hasMethod('msg')){ //得到这个方法类的一个实例 $remethod = $plugin->getMethod('msg'); //如果它是静态方法,则直接调用即可 if($remethod->isStatic()){ $remethod->invoke(null); }else{ //先声明插件类的一个实例,然后调用它 $pluins = $plugin->newInstance(); $remethod->invoke($pluins); } } }}/***我们只需要调用这一个函数就可以了*它自动搜索所有的插件,并且执行插件的msg函数*/myexec();
思路清晰吗?清晰请打1.。。。O(∩_∩)O~