* * * * *
钩子设计与实现
没有使用钩子函数的情下,
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 />
`