深入解讀PHP插件機制原理_PHP教程
Jul 15, 2016 pm 01:35 PM
我們在這篇文章中主要向大家講了一些
插件,亦即Plug-in,是指一類特定的功能模塊(通常由第三方開發(fā)者實現),它的特點是:當你需要它的時候激活它,不需要它的時候禁用/刪除它;且無論是激活還是禁用都不影響系統(tǒng)核心模塊的運行,也就是說插件是一種非侵入式的模塊化設計,實現了核心程序與插件程序的松散耦合。一個典型的例子就是Wordpress中眾多的第三方插件,比如Akimet插件用于對用戶的評論進行Spam過濾。
一個健壯的PHP插件機制,我認為必須具備以下特點:
插件的動態(tài)監(jiān)聽和加載(Lookup)
插件的動態(tài)觸發(fā)
以上兩點的PHP插件機制實現均不影響核心程序的運行
要在程序中實現插件,我們首先應該想到的就是定義不同的鉤子(Hooks);“鉤子”是一個很形象的邏輯概念,你可以認為它是系統(tǒng)預留的插件觸發(fā)條件。它的邏輯原理如下:當系統(tǒng)執(zhí)行到某個鉤子時,會判斷這個鉤子的條件是否滿足;如果滿足,會轉而先去調用鉤子所制定的功能,然后返回繼續(xù)執(zhí)行余下的程序;如果不滿足,跳過即可。這有點像匯編中的“中斷保護”邏輯。
某些鉤子可能是系統(tǒng)事先就設計好的,比如之前我舉的關于評論Spam過濾的鉤子,通常它已經由核心系統(tǒng)開發(fā)人員設計進了評論的處理邏輯中;另外一類鉤子則可能是由用戶自行定制的(由第三方開發(fā)人員制定),通常存在于表現層,比如一個普通的PHP表單顯示頁面中。
可能你感覺上面的話比較無聊,讓人昏昏欲睡;但是要看懂下面我寫的代碼,理解以上PHP插件機制的原理是必不可少的。
下面進行PHP中插件機制的核心實現,整個機制核心分為三大塊:
一個插件經理類:這是核心之核心。它是一個應用程序全局Global對象。它主要有三個職責:
負責監(jiān)聽已經注冊了的所有插件,并實例化這些插件對象。
負責注冊所有插件。
當鉤子條件滿足時,觸發(fā)對應的對象方法。
插件的功能實現:這大多由第三方開發(fā)人員完成,但需要遵循一定的規(guī)則,這個規(guī)則是插件機制所規(guī)定的,因插件機制的不同而不同,下面的顯示代碼你會看到這個規(guī)則。
插件的觸發(fā):也就是鉤子的觸發(fā)條件。具體來說這是一小段代碼,放置在你需要插件實現的地方,用于觸發(fā)這個鉤子。
PHP插件機制原理講了一大堆,下面看看我的實現方案:
插件經理PluginManager類:
以下為PHP插件機制引用的內容:
- ?? ?
- class?PluginManager ?
- { ?
- private?$_listeners?=?array(); ?
- 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); ?
- } ?
- } ?
- } ?
- } ?
- #此處做些日志記錄方面的東西 ?
- } ?
- function?register($hook,?&$reference,
?$method) ? - { ?
- //獲取插件要實現的方法 ?
- $key?=?get_class($reference).'->'.$method; ?
- //將插件的引用連同方法push進監(jiān)聽數組中 ?
-
$this->_listeners[$hook][$key]?=?
array(&$reference,?$method); ? - #此處做些日志記錄方面的東西 ?
- } ?
- function?trigger($hook,?$data='') ?
- { ?
- $result?=?''; ?
- //查看要實現的鉤子,是否在監(jiān)聽數組之中 ?
-
if?(isset($this->_listeners[$hook])?
&&?is_array($this->_listeners[$hook])?
&&?count($this->_listeners[$hook])?>?0) ? - { ?
- //?循環(huán)調用開始 ?
- foreach?($this->_listeners[$hook]?as?$listener) ?
- { ?
- //?取出插件對象的引用和方法 ?
- $class?=&?$listener[0]; ?
- $method?=?$listener[1]; ?
- if(method_exists($class,$method)) ?
- { ?
- //?動態(tài)調用插件的方法 ?
- $result?.=?$class->$method($data); ?
- } ?
- } ?
- } ?
- #此處做些日志記錄方面的東西 ?
- return?$result; ?
- } ?
- } ?
- ?>?
以上代碼加上注釋不超過100行,就完成了整個插件機制的核心。需要再次說明的是,你必須將它設置成全局類,在所有需要用到插件的地方,優(yōu)先加載。用#注釋的地方是你需要自行完成的部分,包括PHP插件機制的獲取和日志記錄等等。

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

??? ?? ??? ??? ?? JavaScript? MediareCorder API? ?? PHP ???? ???? ?????. 2. PHP? ???? ?? ??? ???? STTAPI (? : Google ?? Baidu ?? ??)? ???? ???? ?????. 3. PHP? ???? AI ??? (? : OpenAigpt)? ????. 4. ?? ?? PHP? TTSAPI (? : Baidu ?? Google ?? ??)? ???? ??? ?? ??? ?????. 5. PHP? ?? ??? ??? ??? ??? ?? ?? ??? ?????. ?? ????? PHP? ?? ???? ?? ?? ?? ??? ??? ?????.

PHP?? ?? ?? ??? ???? ?? ??? ? ???? ?? ??? ???? ?? ??? ???? ???? ????. 1. ?? ?? ??? ?? ??? URL ? ?? ??? ????. 2. UrlenCode? ???? ?? ??? ???????. 3. ? ???? ????? ?? ?? ??? ? ?? ??? ?????. 4. ???? ???? ?? ? ? ??? ??? ??? ??? ?????. 5. ??? ?? ??? ????? ?? ????? OG ??? ???? ?????. 6. XSS ??? ???? ?? ??? ??? ?????. ? ???? ??? ??? ???? ??? ?? ?? ??? ??? ???? ??? ?? ??? ?????.

AI? ??? ??? ?? ?? ? ?? ???? ????? ?? ??? ??????. 1. Baidu, Tencent API ?? ?? ?? NLP ?????? ?? ??? AI ?? ?? API? ??????. 2. PHP? ? ?? guzzle? ?? API? ???? ?? ??? ??????. 3. ?? ????? ?? ?? ??? ???? ???? ???? ??? ??? ? ????. 4. ?? ?? ? ?? ???? ?? PHP-L ? PHP_CODESNIFFER? ??????. 5. ???? ????? ???? ?? ?? ??? ?????? ??? ??????. AIAPI? ??? ? ???, ?? ??, ?? ? PHP ?? ??? ??? ???. ?? ???? PSR ??? ???, ??? ????? ????, ?? ??? ???, ????? ??? ????, X? ???????.

1. ?? ???? ??? ??? ?????? ?? ?? ??? ??, ??? ?? ???? ??? (? : ?? ???, ? ? ??), ?? ??? ?? ???? ???? ? ?? ?? ??? ??? ?? ??? ????????. 2. ?? ??? ??? ?? ? ??? ???? ?? ?? ?? ???? ?? ? ?? AUDIT ?? ??? ??? ? ????? ????? ??? ???????. 3. ?? ?? ??? ?? ??? ???????. Recaptchav3 ???? ??, ??? ?? ?? ?? ?? ??, IP ? ?? ??? ??? ??? ?? ???? ??? ?? ??? ????? ??? ???? ????? ??? ?????.

PHP? AI ??? ??? ?? ????? ??? API? ?? ?????. ??? ??? ????? ? ??? ???? ?????. API ??? ?? ?? ??? ???? ??? ??? ???? ???? ? ????. 2. ?? ?? ???? guzzle ?? curl? ???? HTTP ??? ???, JSON ??? ??? ? ???, API ? ?? ??, ??? ? ?? ??? ???? ??, ??? ?? ?? ? ? ?? ????, ??? ?? ? ?????? ?????. 3. ???? ???? ?? ???? API ??, ?? ? ??? ?? ??, ??? ?? ??, ?? ?? ? ??? ??? ??? ?????. ?? ??? ??? ??? ? ??? ???? Propt ?? ? ?? ?? ??, ??? ?? ? ?? ????, ?? ?? ?? ???? ? ??? ?? ? ???? ????? ?????.

PHP? ?????? ????? ?? ?? ?? ???? ???? ?? ???? ???? ?? ?? ???? ?????. 2. ?? ??? ???? ???? ?? ??? ?? ? ??? ??? ???? ?? API/Webhook ??? ??? ?? ???? ??? ??? ??? ??? ?????. 3. ?? ????? ?? ??, ??/???? ????, ???? ??, ???? ? ??? ?????? ????? ?? ??? ???? ???? ?? Dingtalk, SMS ?? ??? ???? ??? ?????? ???? ?? ? ??? ??? ????? ?? ??? ???? ???????.

PhpisstillRelevantinmodernenterpriseenvironments.1. Modernphp (7.xand8.x)? ??? ??, ??? ??, jitcompilation ? modernsyntax, mateitsuilableforlarge-scalepplications

??? AI ?? ?? ???? ???? PHPSDK? ??????. 2. PHP? ???? FFMPEG? ???? ???? API ?? ?? (? : WAV)?? ?????. 3. ??? ???? ????? ????? API ???? ??? ??????. 4. NLP ??? ???? JSON ??? ???? ???? ?????. 5. ?? ??? ???? ???? ?? ?? ?? ?? ?? ??? ?????. ?? ????? ?? ?? ? ??? ???? ?? ??? ???, ??? ?? ? ??? ???????.
