PHP插件系统的实现(四):实现注册动作
注册动作
到现在发现者的工作基本已经完成,我们需要让员工自己选择喜欢做的事情.
所以需要实现一个 register() 方法
首先需要思考一下注册参数需要接收什么参数?
既然是插件系统 那么就有钩子这个概念,那么加一个$hook形参.
注册时候是不是需要将类中的方法传递过来放到函数中那么我们定义一个$method.
现在有了 $hook and $method 总感觉缺点什么,emmm….
好像没类名,没有类名的话有方法名没用,那么需要再加一个$class_name
其实在做的时候就已经构思了一下自己要实现的插件的是个什么样子的,所以我将插件入口做为一个类
# $hook钩子 $class_name类名 $method 方法名
$class_name 需要引用 并方入
public function register($hook, &$class_name, $method)
{
#获取类名和方法名链接起来做下标
$func_class = get_class($class_name).'->'.$method;
#将类和方法放入监听数组中 以$func_class做下标
$this->_staff[$hook][$func_class] = array(&$class_name, $method);
}
注册方法已经完成,但是如何调用呢?现在在插件中是不可能进行调用的.所以我们需要在detector方法中将类传过去
public function detector(){
//主要功能为将插件需要执行功能放入 $_staff
$plugins = $this->get_active_plugins();
if($plugins){
foreach($plugins as $plugin){
#这里将所有插件践行初始化
#路径请自己注意
if (@file_exists($plugin['path'])){
include_once($plugin['path']);
#此时设定 文件夹名称 文件名称 类名 是统一的 如果想设定不统一请自己在get_active_plugins()内进行实现
$class = $plugin['name'];
if (class_exists($class)){
#初始化所有插件类
#---------------------------
//new $class();
#-----------改为----------------
new $class($this); #将当前类传过去 提供给插件类引用
}
}
}
}
}
这个时候 插件中就可以使用 register 这个方法了 到现在发现插件->注册插件 已经完成的差不多了,接下来就是执行插件
本作品采用《CC 协议》,转载必须注明作者和本文链接
嵌套超过3层,我就开始头疼 :sweat_smile: