我有一个带有两种魔术方法的TableData类。一个是构造函数,另一个是__call方法。
我用以下代码实现了调用:
$class = new ReflectionClass('TableData');
$class->newInstanceArgs($parArray);
效果很好。但现在我想用我的魔法。所以我打电话给$class->getData()
,但它不起作用。我得到了错误,我称之为未定义的方法
我尝试使用ReflectionMethod并调用,但它不再起作用。
是否无法将ReflectionClass对象强制转换为我的TableData类?
感谢您的建议!
答案 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
}
}