InitPHP框架Hook机制解读

来源:互联网 发布:淘宝 宝贝 下架时 编辑:程序博客网 时间:2024/04/29 09:06

wordpress受到大部分人的追捧是因为它有一个强大的挂件机制,这个机制可以让全世界各地不同的开发者参与进来,并且不影响原有核心程序代码。

今天来分析下,initphp框架中对hook的处理:

/** *InitPHP Hook钩子函数 * *  @param  string $class  钩子名称 *  @param  array  $function   *  @return object */public static function hook($hookname, $data = '') {global $InitPHP_conf;//配置文件$hookconfig = $InitPHP_conf['hook']['path'] . '/' . $InitPHP_conf['hook']['config'];if (!isset(self::$instance['inithookconfig']) && file_exists($hookconfig)) {self::$instance['inithookconfig'] = require_once($hookconfig);}if (!isset(self::$instance['inithookconfig'][$hookname])) return false;if (!is_array(self::$instance['inithookconfig'][$hookname])) {self::_hook(self::$instance['inithookconfig'][$hookname][0], self::$instance['inithookconfig'][$hookname][1], $data);} else {foreach (self::$instance['inithookconfig'][$hookname] as $v) {self::_hook($v[0], $v[1], $data);}}}/** *InitPHP Hook钩子具体处理函数 * *  @param  string $class  钩子的类名 *  @param  array  $function  钩子方法名称 *  @return object */private static function _hook($class, $function, $data = '') {global $InitPHP_conf;//类处理if (preg_match('/[^a-z0-9\-_.]/i', $class)) return false;$file_name  = $InitPHP_conf['hook']['path'] . '/' . $class . $InitPHP_conf['hook']['file_postfix']; $class_name = $class . $InitPHP_conf['hook']['class_postfix']; //类名if (!file_exists($file_name)) return false;if (!isset(self::$instance['inithook'][$class_name])) {require_once($file_name);if (!class_exists($class_name)) return false;$init_class = new $class_name;self::$instance['inithook'][$class_name] = $init_class;}if (!method_exists($class_name, $function)) return false;return self::$instance['inithook'][$class_name]->$function($data);}


这两个函数是initphp.php核心运行类文件中的两个函数,使用方法:InitPHP::hook('钩子名称','额外传递参数'),钩子可以在Controller中直接使用,也可以在模板中使用。钩子放置一般在程序员开发中,大概知道这个地方会扩展,但是现在项目中又不需要开发这个功能的时候,可以放置一个钩子。

 

/*************initphp.conf.php配置*************//* hook插件机制 - 插件文件目录 */$InitPHP_conf['hook']['path']          = 'lib/hook'; //插件文件夹目录, 不需要加'/'$InitPHP_conf['hook']['class_postfix'] = 'Hook'; //默认插件类名后缀$InitPHP_conf['hook']['file_postfix']  = '.hook.php'; //默认插件文件名称$InitPHP_conf['hook']['config']        = 'hook.conf.php'; //配置文件

 

可以看到这个是框架的一个hook配置类,可以配置钩子实现的类的存放文件夹、后缀名称、配置文件名称等。

 

/* hook的实现,都依赖于hook.conf.php配置文件 每个钩子实现都需要配置这个挂载conf *//* *  钩子名称 => array(array('挂钩上对应的类名称', '函数名称')) 一个挂钩多个函数 *  钩子名称 => array(挂钩上对应的类名称,函数名称) //一个挂钩一个钩子函数 */return array(    //guest挂钩,InitPHP::hook('guest','Hook'); 在程序中放置钩子,guest钩子名称,Hook传递的参数    'guest' => array(         array('test', 'run'),         array('test', 'aa')    ));


这个是hook.conf.php,挂钩的配置文件,这个配置文件存放在hook文件的目录下面,这个配置文件告诉挂钩,你的挂钩上加载了哪些类的函数。

 

/* 实现钩子,test.hook.php *///一个测试的钩子class testHook {    public function run($data) {          echo '第一个简单的' . $data;    }        public function aa($data) {        echo '<BR>第二个简单的' . $data;    }}


具体实现钩子函数。这个类名为test,实现了一个run函数和一个aa函数,这两个函数挂载在上面配置文件中的guest钩子函数上,这样只要在使用InitPHP::hook('guest')都会来触发这两个函数。

 
原创粉丝点击