2013-07-04 62 views
0

我正在寫一個方法,可以調用任何類的任何方法(此過程是動態的)。 在我的方法中,我需要根據返回的值類型找出返回值的類型,然後繼續下一步。有沒有辦法來檢查方法返回的值的類型?

例如:

<?php 
    function identifyReturnType($className, $methodName) { 
     $result = $className->$methodName(); 
     //Here I need to find out the $result type 
    } 
?> 

我有很多類,其中方法返回布爾,字符串,整數等 並有不返回任何東西的一些方法,這些方法設置的值對象或對象有資源指針:

<?php 
    function getCategories() { 
     $this->query("SELECT * FROM categories"); 
    } 

    function getItems() { 
     $this->query("SELECT * FROM items"); 
     $this->getValues(); 
    } 
?> 

PHP gettype($ var)方法找出什麼是值類型,但爲此,我的方法必須返回一個值。我有案例(正如我上面解釋的)哪裏方法只是設置查詢對象。

請分享你的想法。

非常感謝。

+0

不知道如果我挺按照你的問題,但 - 樣JS-所有函數/方法隱含如果沒有'return'語句找到返回。在JS中,這是'undefined',在PHP中,'null'被返回。所以只需'return $ result'就可以了。另外:'$ classname - > $ methodname()'?我希望你傳遞一個實例,而不是'$ className'的字符串,否則你的代碼肯定會失敗。 –

+0

是的,你是對的。謝謝。 – RaviRokkam

回答

0

這真的取決於你的實現。有些遵循架構,每個函數都會以數組的形式返回數據。即使對於查詢返回的數據也是以小塊數組的形式返回的。這完全取決於你如何優化或編寫你的腳本。假設你正在獲取所有聯繫人,並且如果你在數據庫中說了10,000個聯繫人,並且你將所有聯繫人都返回給了一個數組,那麼這是一個壞主意如果你希望函數以數組的形式返回數據,那麼使用分頁和小數字返回。

我有這個問題,我們有一個用PHP/Mysql編寫的大型Web應用程序。在這段時間裏,我們擁有數千個不同班級的職能。現在我們必須開發一個具有不同功能的REST API。主要的問題是我們沒有使用不同的函數來返回查詢對象,有的返回數組,有的返回布爾值等等。該API應該將數據作爲JSON返回。現在我們必須選擇使用現有的代碼來實現不同的功能,或者重新編寫API的新代碼。第二種選擇更昂貴,所以我們留下第一選擇。但是我提到的問題遠不止於方法會返回不同的類型,而且我們是否需要真正編寫更多的代碼來檢查哪個函數被調用,以及如果調用say函數「xyz()」,並且我們知道它返回的查詢對象然後通過它循環生成數組,然後json。這不是一個壞主意,而且會花費很多精力,然後更好地編寫單獨的代碼。

所以我們遵循以下的方法。

我們的API調用看起來像

www.api.oursite.com/api/v1/Resource/Method?param = ....

現在我們捕獲資源和方法,其中resource是類名,Method是該類的方法名。

,所以我們知道我們必須調用資源 - >()方法

現在我們所謂ResourceMethodMap.class.php的一類,它包含數組作爲

static $resource_method_map = array(
    "Users"=>array(
"getUserInfo"=> // gets the user info 
array(
"return"=>"array", 
"accessToken"=>true 
) 
), 
.... 
... 

所以API請求處理代碼就像

public function call_method($resource = "",$method=""){ 
    if($resource == "") $resource = $this->get_resource(); 
if($method == "") $method = $this->get_api_method(); 
if (class_exists($resource)) { 
    $resource_obj = new $resource(); 
     // Parse the method params as array 
    $param_array = $this->parse_method_params($resource,$method); 
     if(false !== $param_array){ 
    $result = call_user_func_array(array($resource_obj, $method), $param_array); 
}else{ 
    $result = $resource_obj->$method() ; 
} 
return $this->process_return_data($resource,$method,$result,$resource_obj);     
}else{ 
$this->setMessage("Invalid Resource"); 
return false ; 
} 

}

這裏的功能process_return_data()會做返回的數據轉換爲

功能process_return_data($資源,$方法,$ RET_VAL,$ resource_obj = NULL){ 如果(array_key_exists( 「迴歸」,ResourceMethodMap: :$ resource_method_map [$ resource] [$ method])){ $ return_type = ResourceMethodMap :: $ resource_method_map [$ resource] [$ method] [「return」]; $ return_array = array(); switch($ return_type){ case'boolean': if(false === $ ret_val){ return false;如果(is_array($ ret_val)){ }返回$ ret_val;否則{ 如果(is_array($ ret_val)){ 返回$ ret_val; } elseif(true === $ ret_val){ return $ ret_val; } else { $ return_array [] = $ ret_val; return $ return_array;
} } break; case'array': return $ ret_val; 休息; } ..... }}

所以,是的,它完全在開發商,他們要如何返回他們的數據。上面的例子只是我們實現的一個實時場景。

我已經發布了完整的代碼她http://codepad.org/MPY1gVed有看

0

你真的需要一種方法來調用其他方法嗎?你可以只實例化類和手動

+0

是的,正確的,但我正在開發的接口需要有一個通用的方法,它會調用其他類的方法。常用方法將具有對象實例和方法名稱作爲參數。 – RaviRokkam

0

叫它adittion我會建議您檢查,像這樣:

if(is_callable($className, $methodName)){ 
     $className->$methodName(); 
} 
相關問題