1. 程式人生 > >跟著辛星用PHP的反射機制來實現插件

跟著辛星用PHP的反射機制來實現插件

red 實現 track 這一 列表 each 方法 fun 繼承

我的博文的前一篇解說了PHP的反射機制是怎麽回事,假設讀者還不清楚反射機制,能夠搜索下或者看我的博文,都是不錯的選擇。我們開始解說一下怎麽用PHP來實現插件機制。所謂插件機制。就是我們定義一個接口。即我們定義一個interface,然後第三方插件就去實現這個interface,然後我們拿到了這個插件之後,去調用這個插件的功能,我們能夠不知道這些插件的類名等信息,我們接下來就用反射機制去實現這個功能。

因為我僅僅是簡單的演示樣例。所以我寫的代碼並不長,並且非常easy,所以,大家既然理解了上面的步驟,那麽就能夠直接看源碼了,當中的凝視還是蠻清楚的。假設讀者有什麽不清楚的,能夠告訴我,我會認真回復的。

<?

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~

跟著辛星用PHP的反射機制來實現插件