亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

淺談PHP中如何實現Hook機制

2024-05-05 00:01:03
字體:
來源:轉載
供稿:網友

對"鉤子"這個概念其實不熟悉,最近看到一個php框架中用到這種機制來擴展項目,所以大概來了解下。

所謂Hook機制,是從Windows編程中流行開的一種技術。其主要思想是提前在可能增加功能的地方埋好(預設)一個鉤子,這個鉤子并沒有實際的意義,當我們需要重新修改或者增加這個地方的邏輯的時候,把擴展的類或者方法掛載到這個點即可。

hook插件機制的基本思想:

在項目代碼中,你認為要擴展(暫時不擴展)的地方放置一個鉤子函數,等需要擴展的時候,把需要實現的類和函數掛載到這個鉤子上,就可以實現擴展了。

思想就是這樣聽起來比較籠統,看一個網上的實現的例子。

整個插件機制包含三個部分:

1.hook插件經理類:這個是核心文件,是一個應用程序全局Global對象。它主要有三個職責

    1>監聽已經注冊了的所有插件,并實例化這些插件對象。

    2>注冊所有插件。

    3>當鉤子條件滿足時,觸發對應的對象方法。

2.插件的功能實現:這大多由第三方開發人員完成,但需要遵循我們(經理類定義)的規則,這個規則是插件機制所規定的,因插件機制的不同而不同。

3.插件的觸發:也就是鉤子的觸發條件。這是一小段代碼,放置在你需要調用插件的地方,用于觸發這個鉤子。

----------------------------------看一看別人實現的方案--------------------------------

首先是插件經理類PluginManager,這個類要放在全局引用里面,在所有需要用到插件的地方,優先加載。

<?php/**** 插件機制的實現核心類*/class PluginManager{  /**   * 監聽已注冊的插件   *   * @access private   * @var array   */  private $_listeners = array();   /**   * 構造函數   *   * @access public   * @return void   */  public function __construct()  {    #這里$plugin數組包含我們獲取已經由用戶激活的插件信息   #為演示方便,我們假定$plugin中至少包含   #$plugin = array(    #  'name' => '插件名稱',    #  'directory'=>'插件安裝目錄'    #);    $plugins = get_active_plugins();#這個函數請自行實現    if($plugins)    {      foreach($plugins as $plugin)      {//假定每個插件文件夾中包含一個actions.php文件,它是插件的具體實現        if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php'))        {          include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php');          $class = $plugin['name'].'_actions';          if (class_exists($class))          {            //初始化所有插件            new $class($this);          }        }      }    }    #此處做些日志記錄方面的東西  }  /**   * 注冊需要監聽的插件方法(鉤子)   *   * @param string $hook   * @param object $reference   * @param string $method   */  function register($hook, &$reference, $method)  {    //獲取插件要實現的方法    $key = get_class($reference).'->'.$method;    //將插件的引用連同方法push進監聽數組中    $this->_listeners[$hook][$key] = array(&$reference, $method);    #此處做些日志記錄方面的東西  }  /**   * 觸發一個鉤子   *   * @param string $hook 鉤子的名稱   * @param mixed $data 鉤子的入參   *  @return mixed   */  function trigger($hook, $data='')  {    $result = '';    //查看要實現的鉤子,是否在監聽數組之中    if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0)    {      // 循環調用開始      foreach ($this->_listeners[$hook] as $listener)      {        // 取出插件對象的引用和方法        $class =& $listener[0];        $method = $listener[1];        if(method_exists($class,$method))        {          // 動態調用插件的方法          $result .= $class->$method($data);        }      }    }    #此處做些日志記錄方面的東西    return $result;  }}

接下來是一個簡單插件的實現DEMO_actions。這是一個簡單的Hello World插件,用于輸出一句話。在實際情況中,say_hello可能包括對數據庫的操作,或者是其他一些特定的邏輯。

<?php/*** 這是一個Hello World簡單插件的實現*//***需要注意的幾個默認規則:*  1. 本插件類的文件名必須是action*  2. 插件類的名稱必須是{插件名_actions}*/class DEMO_actions{  //解析函數的參數是pluginManager的引用  function __construct(&$pluginManager)  {    //注冊這個插件    //第一個參數是鉤子的名稱    //第二個參數是pluginManager的引用    //第三個是插件所執行的方法    $pluginManager->register('demo', $this, 'say_hello');  }  function say_hello()  {    echo 'Hello World';  }}

再接下來就是插件的調用觸發的地方,比如我要將say_hello放到我博客首頁Index.php, 那么你在index.php中的某個位置寫下:

$pluginManager->trigger('demo','');

第一個參數表示鉤子的名字,第二個參數是插件對應方法的入口參數,由于這個例子中沒有輸入參數,所以為空。

這樣一個例子基本上很明確的表達了"鉤子"插件機制的實現方式和邏輯。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产精品三级精品av网址| 亚洲欧美日韩在线高清直播| 97在线视频精品| 久久999免费视频| 欧美香蕉大胸在线视频观看| 一区二区三区视频免费在线观看| 欧美有码在线视频| 亚洲综合大片69999| 久久在线精品视频| 精品亚洲精品福利线在观看| 国产精品27p| 第一福利永久视频精品| 亚洲第一av网| 欧美日本亚洲视频| 成人写真视频福利网| 日韩在线视频线视频免费网站| 久久久久国产精品免费网站| 欧美有码在线观看视频| 欧美激情2020午夜免费观看| 18久久久久久| 中文字幕在线精品| xxxxxxxxx欧美| 国产精品99蜜臀久久不卡二区| 日韩美女在线观看一区| 国产美女91呻吟求| 日韩麻豆第一页| www.亚洲人.com| 亚洲xxx自由成熟| 欧美劲爆第一页| 日韩成人性视频| 亚洲精品视频网上网址在线观看| 久久手机精品视频| 国产精品日韩av| 久久久噜噜噜久噜久久| 久久久国产精品免费| 午夜欧美大片免费观看| 欧美极品少妇全裸体| 69国产精品成人在线播放| 国产成人精彩在线视频九色| 国内精品400部情侣激情| 国产精品天天狠天天看| 91精品国产91久久久久久最新| 国产狼人综合免费视频| 国产综合色香蕉精品| 浅井舞香一区二区| 日韩精品在线观看一区二区| 一区二区欧美日韩视频| 日韩av片电影专区| 国产欧美在线播放| 亚洲精品综合精品自拍| 久99久在线视频| 久久影院资源网| 91精品美女在线| 一本久久综合亚洲鲁鲁| 成人自拍性视频| 日本最新高清不卡中文字幕| 国产亚洲成精品久久| 久久久久久中文| 国产一区二区三区视频在线观看| 久久久亚洲影院你懂的| 精品偷拍各种wc美女嘘嘘| 少妇av一区二区三区| 97免费视频在线| 亚洲精品中文字幕有码专区| 26uuu另类亚洲欧美日本一| 最新69国产成人精品视频免费| 亚洲人成网站在线播| 欧美精品www在线观看| 欧美另类极品videosbestfree| 国产精品一区二区久久久| 国产亚洲视频在线观看| y97精品国产97久久久久久| 成人精品在线观看| 国产精品电影观看| 国内外成人免费激情在线视频网站| 欧美日韩午夜激情| 亚洲网站在线看| 欧美性猛交xxxxx水多| 日韩大陆欧美高清视频区| 中文字幕国产亚洲| 欧美激情一区二区三区高清视频| 日韩中文综合网| 精品久久香蕉国产线看观看gif| 国产精品高潮视频| 久久精品视频中文字幕| 亚洲激情视频在线观看| 亚洲欧美第一页| 欧美丰满少妇xxxxx做受| 欧美裸体xxxx| 91高清视频在线免费观看| 狠狠综合久久av一区二区小说| 精品国产乱码久久久久久天美| 久久精品免费电影| 国产亚洲精品美女久久久| 伊人久久大香线蕉av一区二区| 欧美精品激情视频| 日本精品免费观看| 亚洲女人被黑人巨大进入al| 日韩成人av一区| 国产精品大片wwwwww| 日韩在线视频免费观看高清中文| 日韩在线视频二区| 亚洲国产精品成人av| 亚洲aⅴ男人的天堂在线观看| 欧美激情一级精品国产| 亚洲自拍小视频| 亚洲香蕉伊综合在人在线视看| 日韩有码在线电影| 日韩欧美精品网站| 最新日韩中文字幕| 怡红院精品视频| www.日韩系列| 成人精品一区二区三区| 日韩在线观看成人| 粉嫩av一区二区三区免费野| 欧美电影免费观看高清完整| 揄拍成人国产精品视频| 久久久91精品国产| 亚洲91av视频| 亚洲电影免费观看高清完整版| 精品视频中文字幕| 久久视频国产精品免费视频在线| 国产视频亚洲视频| 中文字幕日韩av电影| 久久这里只有精品视频首页| 日韩欧美亚洲范冰冰与中字| 国产精品欧美亚洲777777| 日韩在线免费av| 色狠狠av一区二区三区香蕉蜜桃| 色先锋资源久久综合5566| 91成人天堂久久成人| 日韩专区在线播放| 91香蕉嫩草影院入口| 欧美一级在线播放| 亚洲欧美国产一本综合首页| 日韩美女av在线免费观看| 黑人极品videos精品欧美裸| 亚洲一区二区久久久久久久| 亲爱的老师9免费观看全集电视剧| 亚洲精品电影久久久| 川上优av一区二区线观看| 日韩在线观看电影| 亚洲专区在线视频| 久热国产精品视频| 欧美激情亚洲自拍| 7777免费精品视频| 欧美日韩一区二区三区| 永久免费毛片在线播放不卡| 欧美成人h版在线观看| 91久久久久久久久久久久久| 91av在线视频观看| 欧美夜福利tv在线| 日产日韩在线亚洲欧美| 成人在线免费观看视视频| 国产精品成人观看视频国产奇米| 久久久91精品| 在线观看日韩www视频免费| 国产精品网红福利| 欧美专区日韩视频| 亚洲成人精品久久久| 综合网日日天干夜夜久久| 久久国产精品偷| 国产97免费视| 毛片精品免费在线观看|