提示:PHP中插件機制的一種實現方案.
這篇文章的出發點是我對插件機制的理解,及其在PHP中的實現。此方案僅是插件機制在PHP的實現方案之一,寫下來和大家分享,歡迎大家一起討論。
插件,亦即Plug-in,是指一類特定的功能模組(通常由第三方開發者實現),它的特點是:當你需要它的時候激活它,不需要它的時候禁用/刪除它;且無論是啟動或停用都不影響系統核心模組的運行,也就是說插件是一種非侵入式的模組化設計,實現了核心程式與插件程式的鬆散耦合。一個典型的例子就是Wordpress中眾多的第三方插件,例如Akimet插件用於對用戶的評論進行Spam過濾。
一個健全的插件機制,我認為必須具備以下特點:
插件的動態監聽和加載(Lookup)
插件的動態觸發
以上兩點的實現均不影響核心程序的運行
以上兩點的實現均不影響核心程序的運行時
中實作插件,我們首先應該想到的就是定義不同的鉤子(Hooks);「鉤子」是一個很形象的邏輯概念,你可以認為它是系統預留的插件觸發條件。它的邏輯原理如下:當系統執行到某個鉤子時,會判斷這個鉤子的條件是否滿足;如果滿足,會轉而先去調用鉤子所製定的功能,然後返回繼續執行餘下的程序;如果不滿足,跳過即可。這有點像是彙編中的「中斷保護」邏輯。
某些鉤子可能是系統事先就設計好的,比如之前我舉的關於評論Spam過濾的鉤子,通常它已經由核心系統開發人員設計進了評論的處理邏輯中;另外一類鉤子則可能是由使用者自行自訂的(由第三方開發人員制定),通常存在於表現層,例如一個普通的PHP表單顯示頁面。
可能你覺得上面的話比較無聊,讓人昏昏欲睡;但是要看懂下面我寫的程式碼,理解以上的原理是不可或缺的。
下面進行PHP中插件機制的核心實現,整個機制核心分為三大塊:
一個插件經理類:這是核心之核心。它是一個應用程式全域Global物件。它主要有三個職責:
負責監聽所有已經註冊了的插件,並實例化這些插件物件。
負責註冊所有外掛程式。