1

我尝试动态检索一个类的方法,但是 php 抛出一个异常,上面写着 Undefined property: 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 是一个对象的实例(不是标准的)

$name 是我需要在 Object 中遍历的内容,例如,当我需要 $row->student->gifts->totalPoint() 时,只需将 student->gifts->totalPoint() 传递给 $name 参数的方法

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

4

1 回答 1

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()您可能还需要容纳的数组。

于 2013-08-26T19:57:29.397 回答