🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* * * * * 钩子设计与实现 没有使用钩子函数的情下, function fun(){ fun1(); fun2(); ... } 执行fun的时候,按照顺序执行完所有函数。 使用钩子,就是为了让他执行我们需要执行的函数。 创建钩子: 1.创建钩子函数前,必须要有很多钩子函数所需要的函数 比如 计算点击率 onclink_counter(); 是否检测登录is_login(bool $str); 打开验证窗口等open_chuangkou($condition检测条件); 等等. 创建挂钩点 挂钩点是一个字符串,该字符串必须是钩子函数列表中的一个函数名称 $h='body_start' ;//从配置文件中获得相应的配置信息 创建钩子函数 function hook($data){ global $h; return $h(); } 钩子函数根据变量$h(挂钩点所代表的字符串),去在钩子函数列表中查找所对应的具体函数,找到则执行或者返回该函数。 钩子函数设计成类 举例 is_callable: 验证变量的内容能否作为函数调用。 这可以检查包含有效函数名的变量,或者一个数组,包含了正确编码的对象以及函数名。 下面是wordpress的一个钩子类,有点复杂 * * * * * `class Hook { //action hooks array private static $actions = array(); /** * ads a function to an action hook * @param $hook * @param $function */ //返回一个挂载数组(数组键为挂钩点,值为一个有效的函数或者方法名称) public static function add_action($hook,$function) { //将钩挂点小写,为了查找方法名称 $hook=mb_strtolower($hook,CHARSET); //检查该类中是否存在方法名为hook的方法 if(!self::exists_action($hook)) { //如果方法中没有挂钩点方法,则将挂钩点封装到数组 //并且给改挂载点数组设为空数组 self::$actions[$hook] = array(); } // 检测传递的方法名称是否为合法方法名称 if (is_callable($function)) { //将挂载点数组设为传递进来的函数名称 self::$actions[$hook][] = $function; return TRUE; } return FALSE ; } /** * executes the functions for the given hook * @param string $hook * @param array $params * @return boolean true if a hook was setted */ public static function do_action($hook,$params=NULL) { $hook=mb_strtolower($hook,CHARSET); 检测是否已经存在了挂载数组 if(isset(self::$actions[$hook])) { 如果存在,则循环这个挂载数组 foreach(self::$actions[$hook] as $function) { if (is_array($params)) { 如果外部传递的$params参数是数组, 则将数组传递给方法$function,并且将$function函数执行 call_user_func_array($function,$params); } else { 不过不是数组,则将参数一字符的形式传递给函数$function,并且让他自动执行 call_user_func($function); } //cant return anything since we are in a loop! dude! } return TRUE; } return FALSE; } /** * gets the functions for the given hook * @param string $hook * @return mixed */ public static function get_action($hook) { //返回钩子挂载数组 $hook=mb_strtolower($hook,CHARSET); return (isset(self::$actions[$hook]))? self::$actions[$hook]:FALSE; } /** * check exists the functions for the given hook * @param string $hook * @return boolean */ public static function exists_action($hook) { //检测是否存在挂载数组 $hook=mb_strtolower($hook,CHARSET); return (isset(self::$actions[$hook]))? TRUE:FALSE; } } /** * Hooks Shortcuts not in class */ function add_action($hook,$function) { //设置为了单例类 return Hook::add_action($hook,$function); } function do_action($hook) { //设置为了单例类 return Hook::do_action($hook); } //添加钩子 Hook::add_action('unique_name_hook','some_class::hook_test'); //或使用快捷函数添加钩子: add_action('unique_name_hook','other_class::hello'); add_action('unique_name_hook','some_public_function'); //执行钩子 do_action('unique_name_hook');//也可以使用 Hook::do_action(); 上面类给钩子提供了一个基类平台,让钩子去选择执行函数。 是一套比较完整完善的钩子类,可以基于tp实现。 * * * * * 其实还可以定义简单的一个类来实现。 $c=get_class_name(); //获得类的名字 $m=get_method_name(); //获得方法的名字 $k=$c->$m(); //执行类的某一个方法 <br /><br /><br /> <hr /> footer: 版权所有:duerhong <hr /> <br /> `