* * * * *
鉤子設計與實現
沒有使用鉤子函數的情下,
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 />
`