2012-09-27 81 views
4

我正在努力,我需要能夠將索引的數組傳遞給方法,很像call_user_func_array的工作原理。我會使用call_user_func_array,但它不是一個OOP方法,這是不受歡迎的,它要求方法是靜態的,這會打破目標類的OO。動態調用類方法的參數

我曾嘗試使用ReflectionClass但無濟於事。你不能調用參數給類的方法,只能調用構造函數。這是不幸的,不是渴望的。

所以我把手冊頁,看着ReflectionFunction,但沒有辦法實例化的類,它指向一個方法,然後invokeArgs它。

實施例使用ReflectionFunction(記住,這一問題被標記PHP 5.4,因此語法):

$call = new \ReflectionFunction("(ExampleClass())->exampleMethod"); 
$call->invokeArgs(["argument1", "argument2"]); 

此失敗:

Function (Index())->Index() does not exist 

使用實施例ReflectionMethod

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 
print_r($call); 

這失敗:

ReflectionMethod Object 
(
    [name] => Index 
    [class] => Index 
) 

參數永遠不會傳遞給方法。

期望的結果是:

class ExampleClass() { 
    public function exampleMethod($exampleArg1, $exampleArg2){ 
     // do something here 
     echo "Argument 1: {$exampleArg1}\n"; 
     echo "Argument 2: {$exampleArg2}\n"; 
    } 
} 

$array = [ 'exampleArg1Value', 'exampleArg2Value' ]; 

如果我通過$array到的ExampleClass->exampleMethod()一個實例,我將僅具有一個參數,這將是一個數組。相反,我需要能夠拉動個別論點。

我在想,如果有一種方法可以在ReflectorClass上撥打ReflectorFunction我會以船形和我的方式,但它看起來不是這樣。

有沒有人有他們曾經用來完成此事的任何事情?

回答

1

由於某種原因,某處卡住了。

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 

現在返回

Argument 1: argument1 
Argument 2: argument2 

我會嘗試重現該問題。這是一個新鮮的PHP 5.4.7安裝與php-cli和fpm。

+0

是的,它應該只是工作,你可以在這裏輕鬆地檢查PHP版本:http://3v4l.org/JUKK9#v547 - 注意你的類不是來自其他命名空間或其他東西。 – hakre

5

據我所知,下面應該工作:

$call = new \ReflectionMethod("ExampleClass", "exampleMethod"); 
$call->invokeArgs(new ExampleClass(), ["argument1", "argument2"]); 
print_r($call); 

什麼次要版本是PHP?你在5.4.7嗎?

+0

是的,我在5.4.7。 –

3

我已經編寫了自己的依賴注入器,並且還動態地構造了帶有參數的類。下面是一些代碼,應該讓你去:

$type = 'ExampleClass'; 

$reflector = new \ReflectionClass($type); 

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

$constructor = $reflector->getConstructor(); 

$parameters = $constructor->getParameters(); 

此時你有一個數組的參數,需要進行施工。您現在可以用這些值替換參數並構建類。

+0

謝謝!我更期待調用一種方法而不是構建一個類。我會玩弄你給你的東西並讓你知道。 –