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

辛星發表於2014-07-24

     我的博文的前一篇講解了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~

相關文章