7

我正在做一些事情,我需要能够将一个索引的 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(),我将只有一个参数,即一个数组。相反,我需要能够提取单个参数。

我在想,如果有一种方法可以召唤我ReflectorFunctionReflectorClass我会以船形和我的方式进入,但看起来这是不可能的。

有没有人有他们以前用来完成此任务的任何东西?

4

3 回答 3

6

AFAIK,以下应该有效:

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

PHP 是什么次要版本?你在 5.4.7 上吗?

于 2012-09-27T19:58:54.783 回答
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();

At this point you have a array of parameters, needed for construction. You can now substitute the parameters with the values and construct the class.

于 2012-09-27T20:24:19.903 回答
3

For some reason, something got stuck, somewhere.

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

Now returns

Argument 1: argument1
Argument 2: argument2

I am going to try to reproduce the issue. It is on a fresh php 5.4.7 install with php-cli and fpm.

于 2012-09-28T13:49:12.787 回答