我尝试动态检索类的方法,但是php会抛出一个异常,表示Undefined属性:stdClass ...
以及我如何尝试获取值
private function getExactValue($row, $name)
{
$tempRow = clone $row;
foreach( explode('->', $name) as $key => $value)
{
$temp = $tempRow->{$value};
unset($tempRow);
$tempRow = $temp;
}
return $tempRow;
}
你能告诉我我的错误是什么吗?$ row是Object的实例(不是Std one)
$ name是我需要在Object中遍历的,例如当我需要$ row-> student-> gifts-> totalPoint()时,只需传递student-> gifts-> totalPoint()到$ name参数的方法
答案 0 :(得分:2)
我看到你在这里想做什么。我的第一个建议是,你正在以一种非常强硬的方式实现你想要实现的目标。如果你想要一种更好的方法来对未知对象执行任意方法,我建议你研究一下PHP的反射功能。
话虽如此,您的代码的问题似乎是您尝试通过字符串执行方法,您需要做的是使用方法的名称。我建议你在你的循环中爆炸->
上的字符串,你试图检测它是否是一个方法,然后相应地采取行动。这看起来像这样:
foreach( explode('->', $name) as $value)
{
$value_trimmed = rtrim($value, '()');
if ($value === $value_trimmed) {
// this is a property
$tempRow = $tempRow->{$value};
} else {
// this is a method
$tempRow = $tempRow->{$value_trimmed}();
}
}
您也应该对输入进行一些验证,以确保每个段都有有效的属性/方法名称,并添加确认整个字符串确实正确形成的验证(即您没有东西比如foo->->bar(())
)。当然,这没有提到如何处理你可能还需要容纳的foo[0]->bar()
数组。