编程/9 分钟阅读

插件机制的实现与原理

如果使用过 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();
		}

然后我们登录测试一下 EVrMRrb.png!web.png 这时候我们发现,在登录处理完后触发了插件的方法。这时候,一个简单的插件就完成了。

发表评论

0 条评论

暂无评论