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')都会来触发这两个函数。
![]()
InitPHP框架Hook机制解读
最新推荐文章于 2022-05-19 13:14:59 发布