php中的鉤子(hook外掛程式機制)

來源:互聯網
上載者:User

標籤:

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

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‘,‘‘);

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

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

 

連結

 

php中的鉤子(hook外掛程式機制)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.