ReflectionClass转换为“普通”类

时间:2010-07-13 10:24:29

标签: php reflection

我有一个带有两种魔术方法的TableData类。一个是构造函数,另一个是__call方法。

我用以下代码实现了调用:

$class = new ReflectionClass('TableData');
$class->newInstanceArgs($parArray);

效果很好。但现在我想用我的魔法。所以我打电话给$class->getData(),但它不起作用。我得到了错误,我称之为未定义的方法 我尝试使用ReflectionMethod并调用,但它不再起作用。

是否无法将ReflectionClass对象强制转换为我的TableData类?

感谢您的建议!

3 个答案:

答案 0 :(得分:9)

您无法在ReflectionClass的实例上调用该方法。您必须在(反映的)原始类的实例上调用该方法。

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
$instance->getData();

答案 1 :(得分:2)

首先获得ReflectionClass的是什么:

class MyClass {
  public function __call($method, $args) {
    var_dump($method);
  }
}

$reflectionClass = new ReflectionClass('MyClass');

然后,实现课程:

$class = $reflectionClass->newInstanceArgs();

$class对象上调用您的方法:

$class->getData();

你会得到预期的结果:

string 'getData' (length=7)


即你必须根据newInstanceArgs而不是ReflectionClass本身的回复来调用你的方法。

答案 2 :(得分:0)

我想知道你为什么要在这里使用Reflection。也许你最好修改你的构造函数来接受一个数组?

不使用反射的原因是缓慢和不可读: 这更容易使用和理解:

$instace = new TableData($parArray);

比这个:

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);

因此,如果您希望构造函数同时处理数组作为参数和参数列表,则可以使用func_get_args

class TableData {
    public function __constructor() {
        if (func_num_args() != 1 || !is_array($params = func_get_arg(0))) {
            $params = func_get_args();
        }

        // now the args are in $params either way
    }
}