我正在开发一些我需要能够将args的索引数组传递给方法的东西,就像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()
的实例,我只会有一个参数,这是一个数组。相反,我需要能够提取各个论点。
我在想,如果有一种方法可以在ReflectorFunction
上调用ReflectorClass
我会在船形状和途中进行调用,但看起来不太可能。< / p>
有没有人有过他们以前用过的东西?
答案 0 :(得分:6)
AFAIK,以下应该有效:
$call = new \ReflectionMethod( "ExampleClass", "exampleMethod" );
$call->invokeArgs( new ExampleClass(), ["argument1", "argument2"] );
print_r( $call );
PHP是什么小版本?你是5.4.7吗?
答案 1 :(得分: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();
此时,您有一系列参数,需要构造。您现在可以使用值替换参数并构造类。
答案 2 :(得分:2)
出于某种原因,某些地方出现了问题。
$call = new \ReflectionMethod( "ExampleClass", "exampleMethod" );
$call->invokeArgs( new ExampleClass(), ["argument1", "argument2"] );
现在返回
Argument 1: argument1
Argument 2: argument2
我将尝试重现这个问题。这是一个新的PHP 5.4.7安装与php-cli和fpm。