PHP中如何?Hook機制

來源:互聯網
上載者:User
本篇文章主要介紹了PHP中如何?Hook機制,詳細的介紹了Hook機制的原理和實現過程,具有一定的參考價值,有興趣的可以瞭解一下

對"鉤子"這個概念其實不熟悉,最近看到一個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','');

第一個參數表示鉤子的名字,第二個參數是外掛程式對應方法的入口參數,由於這個例子中沒有輸入參數,所以為空白。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.