6

快速规格:

PHP 5.3
error_reporting(-1) // the highest

我正在使用__get()按引用技巧神奇地访问对象中任意深度的数组元素。

快速示例:

public function &__get($key){
    return isset($this->_data[$key])
        ? $this->_data[$key]
        : null;
}

这不起作用,因为当$key未设置时,它会尝试null通过引用返回,这当然会抛出Only variable references should be returned by reference ...我尝试按如下方式修改它:

public function &__get($key){
    $null = null;
    return isset($this->_data[$key])
        ? $this->_data[$key]
        : $null;
}

虽然仍然不起作用,我假设该设置$null基本上nullunset()它。

我能做些什么?谢谢!


只是想我会推广这个问题,因为它有点相关(PHP魔法和参考);__callStatic()、call_user_func_array()、参考和 PHP 5.3.1。我还没有找到答案......除了修改 PHP 核心。

4

3 回答 3

19

这与 无关null,而是与三元运算符有关:

用 an 重写它if/else不会抛出通知:

public function &__get($key)
{
    $null = null;
    if (isset($this->_data[$key])) {
        return $this->_data[$key];
    } else {
        return $null;
    }
}

三元运算符不能产生引用。它们只能返回

于 2011-05-11T15:48:09.773 回答
4

我遇到了这个问题,但我最终意识到当找不到密钥时我不应该返回 null ,而是抛出异常(因为我毕竟访问的是未知属性)。

但也许这不是你想做的,我只是想分享一下。

于 2011-05-11T15:43:55.300 回答
4

为什么要null明确返回?如果$key不存在$this->_data它会返回NULL吗?

我建议使用以下内容并在另一端调整您的逻辑。你现在可能已经在检查了null。您可以将其更改为empty()或其他一些变体。或使用Matthieu建议的异常。

public function &__get($key){
    return $this->_data[$key];
}
于 2011-05-11T15:47:21.587 回答