PHP中插件機制的一種實現方案

這篇文章的出發點是我對插件機制 的理解,及其在PHP中的實現。此方案僅是插件機制在PHP中的實現方案之一,寫下來和大家分享,歡迎大家一起討論。

插件 ,亦即Plug-in,是指一類特定的功能模塊(通常由第三方開發者實現),它的特點是:當你需要它的時候 激活它,不需要它的時候禁用/刪除它;且無論是激活還是禁用都不影響系統核心模塊的運行,也就是說插件是一種非侵入式的模塊化設計,實現了核心程序與插件 程序的鬆散耦合。一個典型的例子就是Wordpress中衆多的第三方插件,比如Akimet插件用於對用戶的評論進行Spam過濾。

一個健壯的插件機制,我認爲必須具備以下特點:

  • 插件的動態監聽和加載(Lookup)
  • 插件的動態觸發
  • 以上兩點的實現均不影響核心程序的運行

要在程序中實現插件,我們首先應該想到的就是定義不同的鉤子(Hooks);“鉤子”是一個很形象的邏輯概念,你可以認爲它是系統預留的插件觸發條 件。它的邏輯原理如下:當系統執行到某個鉤子時,會判斷這個鉤子的條件是否滿足;如果滿足,會轉而先去調用鉤子所制定的功能,然後返回繼續執行餘下的程 序;如果不滿足,跳過即可。這有點像彙編中的“中斷保護”邏輯。

某些鉤子可能是系統事先就設計好的,比如之前我舉的關於評論Spam過濾的鉤子,通常它已經由核心系統開發人員設計進了評論的處理邏輯中;另外一類鉤子則可能是由用戶自行定製的(由第三方開發人員制定),通常存在於表現層,比如一個普通的PHP表單顯示頁面中。

可能你感覺上面的話比較無聊,讓人昏昏欲睡;但是要看懂下面我寫的代碼,理解以上的原理是必不可少的。

下面進行PHP中插件機制的核心實現,整個機制核心分爲三大塊:

  • 一個插件經理類:這是核心之核心。它是一個應用程序全局Global對象。它主要有三個職責:
    • 負責監聽已經註冊了的所有插件,並實例化這些插件對象。
    • 負責註冊所有插件。
    • 當鉤子條件滿足時,觸發對應的對象方法。
  • 插件的功能實現:這大多由第三方開發人員完成,但需要遵循一定的規則,這個規則是插件機制所規定的,因插件機制的不同而不同,下面的顯示代碼你會看到這個規則。
  • 插件的觸發:也就是鉤子的觸發條件。具體來說這是一小段代碼,放置在你需要插件實現的地方,用於觸發這個鉤子。

原理講了一大堆,下面看看我的實現方案: 插件經理PluginManager類:  

 

以上代碼加上註釋不超過100行,就完成了整個插件機制的核心。需要再次說明的是,你必須將它設置成全局類,在所有需要用到插件的地方,優先加載。用#註釋的地方是你需要自行完成的部分,包括插件的獲取和日誌記錄等等。

 

下面是一個簡單插件的實現:

 

這是一個簡單的Hello World插件,用於輸出一句話。在實際情況中,say_hello可能包括對數據庫的操作,或者是其他一些特定的邏輯,比如調用Akimet API。

插件實現的默認規則由核心系統開發者自行確定。比如本例的一些默認規則我在註釋中已經寫的很清楚,在此不在贅述。需要特別注意的是鉤子名稱不要重複。

最後一步,就是定義鉤子的觸發,你將鉤子放在哪裏,上面這個插件的方法就會在哪裏出發。比如我要將say_hello放到我博客首頁Index.php,那麼你在index.php中的某個位置寫下:

第一個參數表示鉤子的名字,在本例中它是demo;第二個參數是插件對應方法的入口參數,由於這個例子中沒有輸入參數,所以爲空。

總結

本篇文章介紹了插件機制在PHP中實現的一種方法和思路,以及我本人對插件機制的理解。初次接觸這個東西,可能會比較生澀,難以理解。但是當你結合真實的例子,再想想程序的運行流程,思路可能會更清晰一些。

 

轉自 藍色理想

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章