动态检索对象方法

时间:2013-08-26 19:39:14

标签: php

我尝试动态检索类的方法,但是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参数的方法

你能告诉我我的错误是什么吗?

1 个答案:

答案 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()数组。