跟著辛星用PHP的反射機制來實現外掛程式

來源:互聯網
上載者:User

標籤:資訊   []   而且   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的反射機制來實現外掛程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.