Php “反射”类铸造为“反射”;“正常”;等级

Php “反射”类铸造为“反射”;“正常”;等级,php,reflection,Php,Reflection,我有一个类TableData,它有两个神奇的方法。一个是构造函数,另一个是调用方法 我用以下代码实现了调用: $class = new ReflectionClass('TableData'); $class->newInstanceArgs($parArray); 它工作得很好。但现在我想用我的魔法方法。所以我调用$class->getData(),但它不起作用。我得到一个错误,我调用了一个未定义的方法。 我尝试使用ReflectionMethod和invoke,但它再次无效 没有办法

我有一个类TableData,它有两个神奇的方法。一个是构造函数,另一个是调用方法

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

$class = new ReflectionClass('TableData');
$class->newInstanceArgs($parArray);
它工作得很好。但现在我想用我的魔法方法。所以我调用
$class->getData()
,但它不起作用。我得到一个错误,我调用了一个未定义的方法。
我尝试使用ReflectionMethod和invoke,但它再次无效

没有办法将ReflectionClass对象强制转换为我的TableData类吗


谢谢你的建议

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

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

首先获取
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)


i、 e.您必须对
newInstanceArgs
返回的内容调用方法,而不是对
ReflectionClass
本身调用方法。

我想知道您为什么在这里使用反射。也许您最好修改构造函数以接受数组

不使用反射的原因是速度慢和不可读性: 这更易于使用和理解:

$instace = new TableData($parArray);
除此之外:

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
因此,如果希望构造函数同时处理数组作为参数和参数列表,可以使用
func\u get\u 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
    }
}

我之所以使用,是因为参数的数量甚至不一样。我从5个参数一直到15个参数,所以我找到了更好的反射解决方案。