<div lang='v4ahgver'><address dir='o2zmg9'></address></div>

        <sub dir='yxbc8n'></sub>
        1. <strike id='ytzru1b'></strike>

            <hgroup dir='6qh616i'><label dropzone='kfjzi2s'></label></hgroup>

                文章熱詞:鈎子hook

                日期:2019-09-16 09:57 by admin 1827 1 收藏
                我要分享

                摘要:鈎子是編程裏一個常見概念,非常的重要。它使得系統變得非常容易拓展,(而不用理解其内部的實現機理,這樣可以減少很多工作量)。

                鈎子作用

                鈎子函數可以截獲并處理其他應用程序的消息。每當特定的消息發出,在沒有到達目的窗口前,鈎子程序就先捕獲該消息,亦即鈎子函數先得到控制權。這時鈎子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

                鈎子實現

                鈎子的完整實現應該叫事件驅動。事件驅動分爲兩個階段,第一個階段是注冊事件,目的是給未來可能發生的“事件”起一個名字,簡單的實現方法是
                用單例模式産生一個持久的對象或者注冊一個全局變量,然後将事件名稱,以及該事件對應的類與方法插入全局變量即可。也就是挂載一個鈎子。
                第二個階段是觸發事件,本質上就是在事件的全局變量中查詢要觸發的事件名稱,然後找到注冊好的類與方法,實例化并運行。這樣子就可以擺
                脫傳統方式中程序必須按順序的規則,進一步實現解除耦合的目的。

                代碼示例一

                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阿裏雲短信接口接入

                下一篇:一個 TCP 連接可以發多少個 HTTP 請求?


                評論

                -->