跟著辛星用PHP的反射機制來實現外掛
阿新 • • 發佈:2019-01-09
我的博文的前一篇講解了PHP的反射機制是怎麼回事,如果讀者還不清楚反射機制,可以搜尋下或者看我的博文,都是不錯的選擇,我們開始講解一下怎麼用PHP來實現外掛機制。所謂外掛機制,就是我們定義一個介面,即我們定義一個interface,然後第三方外掛就去實現這個interface,然後我們拿到了這個外掛之後,去呼叫這個外掛的功能,我們可以不知道這些外掛的類名等資訊,我們接下來就用反射機制去實現這個功能。
由於我只是簡單的示例,所以我寫的程式碼並不長,而且很簡單,所以,大家既然理解了上面的步驟,那麼就可以直接看原始碼了,其中的註釋還是蠻清楚的,如果讀者有什麼不清楚的,可以告訴我,我會認真回覆的。
<?php /** *我們定義好一個介面,叫做Ixin */ interface Ixin{ function msg(); } /** *某熱心開發人員給我們寫了一個外掛類 */ class Xin implements Ixin{ function msg(){ echo "辛星你好"; } } /** *我們先搜尋該外掛類,並且判斷它是否實現了msg方法 */ function find(){ //定義描述外掛的陣列 $plugin = array(); foreach (get_declared_classes() as $class) { //例項化反射類的類 $reclass = new ReflectionClass($class); //判斷它是否實現了介面Ixin if($reclass->implementsInterface('Ixin')){ $plugin[] = $reclass; } } return $plugin; } /** *我們去呼叫該外掛的msg方法 */ function myexec(){ $arr = find(); foreach (find() as $plugin) { //判斷該外掛是否有方法msg if($plugin->hasMethod('msg')){ //得到這個方法類的一個例項 $remethod = $plugin->getMethod('msg'); //如果它是靜態方法,則直接呼叫即可 if($remethod->isStatic()){ $remethod->invoke(null); }else{ //先宣告外掛類的一個例項,然後呼叫它 $pluins = $plugin->newInstance(); $remethod->invoke($pluins); } } } } /** *我們只需要呼叫這一個函式就可以了 *它自動搜尋所有的外掛,並且執行外掛的msg函式 */ myexec();
我還是分析一下吧,介面Ixin是我們定義的介面,而類Xin是第三方的外掛,我們用find自動搜尋了所有定義的類,然後我們判斷這些類裡面誰繼承自Ixin,並且實現了msg方法,我們拿到了這個列表自後,就可以用myexec方法去呼叫它們了。
思路清晰嗎?清晰請打1.。。。O(∩_∩)O~