勾點定義
勾點是程式設計裡一個常見概念,非常的重要。它使得系統變得非常容易拓展(而不用理解其內部的實現機理,這樣可以減少很多工作量)。
可以理解為當一個玻璃球從空中落下,即將砸到人的時候,有個事件會提前發生。例如告訴那個被砸的人,球已經在下落過程中,
告訴就是一個事件,一個勾點,我們可以針對不同的人做出不同的相應,如果是男人我們告訴他這個球砸到人不疼,如果是女人則告訴她很疼。
勾點的作用
勾點函數可以截獲並處理其他應用程式的訊息。每當特定的訊息發出,在沒有到達目的視窗前,勾點程式就先捕獲該訊息,亦即勾點函數先得到控制權。這時勾點函數即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。
勾點實現
勾點的完整實現應該叫事件驅動。事件驅動分為兩個階段,第一個階段是註冊事件,目的是給未來可能發生的「事件」起一個名字。
簡單的實現方法是:
用單例模式產生一個持久的物件或者註冊一個全域性變數,然後將事件名稱,以及該事件對應的類與方法插入全域性變數即可。也就是掛載一個勾點。
第二個階段是觸發事件,本質上就是在事件的全域性變數中查詢要觸發的事件名稱,然後找到註冊好的類與方法,範例化並執行。這樣子就可以擺脫傳統方式中程式必須按順序的規則,進一步實現解除耦合的目的。
程式碼範例一:
class Ball{ public function down(){ echo "ball is downing "; //註冊事件 Hook::add("man"); Hook::add("Women"); } public function do(){ Hook::exec(); } } // 勾點的定義 class Hook{ private $hooklist = null ; // 新增 public function add($people){ $this->hooklist[] = new $people(); } // 觸發事件 public function exec(){ foreach($this->hooklist as $people){ $addon ->act(); } } } // 勾點實現 class man(){ public function act(){ echo 'notiong'; } } class WoMan(){ public function act(){ echo 'oh my god '; } } class child(){ public function act(){ echo 'oh my god '; } } $ball = new Ball(); $ball ->down(); $ball ->do();
程式碼範例二:
// 如果需要新增小孩,就可以做新增一個小孩Hook::add("child"); /*=========================勾點的升級版============================================/* class Hook{ private $hookList; //新增 function add($name,$fun){ $this->hookList[$name][] = $fun; } function excec($name){ $value = func_get_args(); unset($value[0]); foreach ($this->hookList[$name] as $key => $fun) { call_user_func_array($fun, $value); } } } $hook = new Hook(); $hook->add('women',function($msg){ echo 'oh my god'.$msg ; }) $hook->add('man',function($msg){ echo 'nothing'.$msg ; }) // 執行 $hook->excec('man','taoge'); $hook->excec('women','xxx');
推薦教學:PHP教學
以上就是PHP中勾點的理解與範例教學的詳細內容,更多請關注TW511.COM其它相關文章!