php 插件的实现

一个插件需要三个条件:
1、插件的支持函数,进行插件的功能实现
2、插件的Hook点,我们称为钩子埋入点,就是在什么地方这个插件要执行。
3、插件的位置

目录结构 Index.php Plugins/Elin/action.php Plugins/Micxp/action.php index.php代码如下: listeners = array(); public function _construct() { $plugins = array(//这里其实可以到数据库查询到相应的插件信息。这里只是为了方便定义了两组插件。 array( ’name’ => ’elin’, ’directory’=>’elin’ ), array( ’name’ => ’micxp’, ’directory’=>’micxp’ ) ); if($plugins) { foreach($plugins as $plugin) { if (@fileexists(‘plugins/’.$plugin['directory'].’/actions.php’)) { includeonce(‘plugins/’.$plugin['directory'].’/actions.php’); $class = $plugin['name'].’actions’; if (classexists($class)){ new $class($this); } } } } } function register($hook, &$reference,$method) { $key = getclass($reference).’->’.$method; $this->listeners[$hook][$key] = array(&$reference, $method); } function trigger($hook, $data=”) { $result = ”; //查看要实现的钩子,是否在监听数组之中 if (isset($this->listeners[$hook]) && isarray($this->listeners[$hook]) && count($this->listeners[$hook]) > 0) { foreach ($this->listeners[$hook] as $listener){ // 取出插件对象的引用和方法 $class =& $listener[0]; $method = $listener[1]; if(methodexists($class,$method)) { // 动态调用插件的方法 $result .= $class->$method($data); } } } #此处做些日志记录方面的东西 return $result; } } $b= new PluginManager(); //上面是NEW一个插件管理类! //这个方法就是在需要调用的地方插入即可! $b->trigger(“elin”,’http://blog.MicXP.com’); ?> Plugins/Elin/action.php插件代码如下: actions{ function _construct($ok){ $ok->register(“elin”, $this,“go”); } function go($url){ header(‘Location:’.$url); } } //这个插件的功能就是做header跳转! ?>

Hibbs

0