【问题标题】:Modifying a PHP array element via magic methods (__get and __set)通过魔术方法(__get 和 __set)修改 PHP 数组元素
【发布时间】:2015-08-11 15:15:45
【问题描述】:

我有以下课程:

/**
 * @property int $barMagic
 */
class Foo
{
    public $barNormal;

    private $attributes = [];

    public function __get($name) {
        return isset($this->attributes[$name]) ? $this->attributes[$name] : null;
    }

    public function __set($name, $value)
    {
        $this->attributes[$name] = $value;
    }
}

如您所见,$barMagic 公共属性没有明确定义,它是通过魔术方法访问的。

在普通属性中设置然后修改数组元素时,它可以正常工作:

$foo = new Foo();
$foo->barNormal = ['baz' => 1];
echo $foo->barNormal['baz'];
$foo->barNormal['baz'] = 2;
echo ',' . $foo->barNormal['baz'];

它按预期输出“1,2”。

但是当使用魔法属性时,它却没有:

$foo = new Foo();
$foo->barMagic = ['baz' => 1];
echo $foo->barMagic['baz'];
$foo->barMagic['baz'] = 2;
echo ',' . $foo->barMagic['baz'];

它输出“1,1”!

在 PHP 中有没有一种方法可以像访问普通属性一样访问魔法属性中的数组元素?

ArrayAccess 接口似乎处理的数组访问比我需要的高一级。

【问题讨论】:

标签: php overloading magic-methods


【解决方案1】:

真正的答案很棘手,并且涉及 PHP 引擎中的一些错误/不一致。正如评论员所建议的,我在 __get() 之前添加了“&”(通过引用返回)字符。所以新代码:

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

但这给了

Notice: Only variable references should be returned by reference in ....

我不得不把它改成

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

现在它可以工作了。请注意,这两个 sn-ps 应该是完全等价的,但它们不是。谢谢大家的贡献,你们带我走了一半。

【讨论】:

  • 这在else 的情况下会很有趣,因为我认为您不能返回对null 的引用。不过需要对此进行测试。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2010-12-09
相关资源
最近更新 更多