標籤:資訊 [] 而且 mod invoke nbsp 外掛程式 代碼 pre
我的博文的前一篇解說了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);//推斷它是否實現了介面Ixinif($reclass->implementsInterface('Ixin')){$plugin[] = $reclass;}}return $plugin;}/***我們去調用該外掛程式的msg方法*/function myexec(){$arr = find();foreach (find() as $plugin) {//推斷該外掛程式是否有方法msgif($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的反射機制來實現外掛程式