目前對鈎子的理解:<轉載:http://www.cnblogs.com/del/archive/2008/02/25/1080825.html>
譬如我們用鼠標在某個窗口上雙擊了一次, 或者給某個窗口輸入了一個字母 A;
首先發現這些事件的不是窗口, 而是系統!
然后系統告訴窗口: 喂! 你讓人點了, 並且是連續點了兩鼠標, 你准備怎么辦?
或者是系統告訴窗口: 喂! 有人向你家里扔磚頭了, 不信你看看, 那塊磚頭是 A.
這時窗口的對有些事件會忽略、對有些事件會做出反應:
譬如, 可能對鼠標單擊事件忽略, 窗口想: 你單擊我不要緊, 累死你我不負責;
但一旦誰要雙擊我, 我會馬上行動, 給你點顏色瞧瞧!
這里窗口准備要采取的行動, 就是我們提前寫好的事件.
用 Windows 的話說, 窗口的事件就是系統發送給窗口的消息; 窗口要采取的行動(事件代碼)就是窗口的回調函數.
但是! 往往隔牆有耳. 系統要通知給窗口的"話"(消息), 可能會被另一個家伙(譬如是一個賊)提前聽到!
有可能這個賊就是專門在這等情報的, 賊知道后, 往往在窗口知道以前就采取了行動!
並且這個賊對不同的消息會采取不同的行動方案, 它的行動方案一般也是早就准備好的;
當然這個賊也不是對什么消息都感興趣, 對不感興趣的消息也就無須制定相應的行動方案.
總結: 這個"賊"就是我們要設置的鈎子; "賊"的"行動方案"就是鈎子函數, 或者叫鈎子的回調函數.
正式開始......
假如有這么一段程序:
function fun(){
fun1();
fun2();
}
首先程序執行完fun1()之后執行fun2()然后fun()結束。
但是,假如我們想對函數做一些變化。比如說,fun是一個解析函數,我們希望后期可以提供豐富的解析函數,而究竟用哪個函數解析,我們希望在配置文件中配置。這個時候就可以發揮鈎子的力量了。
我們可以在function fun(){}中加入一個掛鈎點H,然后再執行H這個函數之前,將鈎子函數配置好,我么就可以根據需要來解析了。
例如:
$h=config_item("parser_fun") ;//從配置文件中獲得相應的配置信息
function fun($data){
global $h;
return $h();
}
除此意外,PHP還可以根據字符串提供自己的類,然后調用類的一個方法,傳遞某些參數,這些就為PHP程序的編寫,以及后期的維護擴展奠定了,相當堅實的基礎。
類的實現方法,大致如下:
$c=get_class_name(); //獲得類的名字
$m=get_method_name(); //獲得方法的名字
$k=$c->$m(); //執行類的某一個方法