动态调用类方法Args

时间:2012-09-27 19:57:18

标签: php oop dynamic method-invocation

我正在开发一些我需要能够将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>

有没有人有过他们以前用过的东西?

3 个答案:

答案 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。