2012-09-05 47 views
1

我正在通過call_user_func_array調用一個對象方法,我根據幾個參數傳遞動態字符串參數。確定call_user_func_array的參數

目前,它類似於此:

<?php 
class MyObject 
{ 
    public function do_Procedure ($arg1 = "", $arg2 = "") 
    { /* do whatever */ } 


    public function do_Something_Else (AnotherObject $arg1 = null) 
    { /* This method requires the first parameter to 
      be an instance of AnotherObject and not String */ } 
} 

call_user_func_array(array($object, $method), $arguments); 
?> 

這適用於方法$method = 'do_Procedure'但如果我想叫$method = 'do_Something_Else'方法,需要的第一個參數是AnotherObject一個實例,我得到一個E_RECOVERABLE_ERROR錯誤。

我如何知道應該傳遞哪種類型的實例?例如。如果此方法需要一個對象實例,但第一個處理的參數是字符串,那麼我如何識別這個以便我可以傳遞null或者直接跳過該調用?

+1

聽起來你是在太動態的函數調用。你不知道你在打什麼電話,而且你不知道你傳遞了什麼樣的論點......那怎麼辦? – deceze

+0

那麼,我通過控制器對象路由請求,方法表示一個調用句柄。有些調用句柄方法可能需要POST或GET對象包裝器,因此應該只有正確的實例。如果字符串被傳遞,你會得到'試圖在一個none對象上調用xxx。 – Daniel

+0

我只想在方法之前驗證參數,而不是手動在每個方法上進行參數驗證。 – Daniel

回答

2

$ arguments是一個將爆炸到函數參數的數組。如果您撥打do_Something_Else函數,陣列必須爲空或第一個元素必須爲空或者爲AnotherObject的一個實例

在所有其他情況下,您會收到E_RECOVERABLE_ERROR錯誤。

要找出需要什麼參數傳遞就可以使用Reflectionclass

樣品,需要一些工作調整土特產品您的需求:

protected function Build($type, $parameters = array()) 
    { 
    if ($type instanceof \Closure) 
     return call_user_func_array($type, $parameters); 

    $reflector = new \ReflectionClass($type); 

    if (!$reflector->isInstantiable()) 
     throw new \Exception("Resolution target [$type] is not instantiable."); 

    $constructor = $reflector->getConstructor(); 

    if (is_null($constructor)) 
     return new $type; 

    if(count($parameters)) 
     $dependencies = $parameters; 
    else 
     $dependencies = $this->Dependencies($constructor->getParameters()); 

    return $reflector->newInstanceArgs($dependencies); 
    } 

    protected static function Dependencies($parameters) 
    { 
    $dependencies = array(); 

    foreach ($parameters as $parameter) { 
     $dependency = $parameter->getClass(); 

     if (is_null($dependency)) { 
     throw new \Exception("Unresolvable dependency resolving [$parameter]."); 
     } 

     $dependencies[] = $this->Resolve($dependency->name); 
    } 

    return (array) $dependencies; 
    } 
+0

我在想反射看到參數類型。但我不確定這是可能的,這就是爲什麼我問。而你的回答正是我在我的問題中解釋的。 – Daniel

+0

我添加了一個樣本 – JvdBerg

+0

'ReflectionParameter :: getClass'正是我所期待的!謝謝。 – Daniel