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