【发布时间】: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 接口似乎处理的数组访问比我需要的高一级。
【问题讨论】:
-
打开所有警告,你会看到“E_NOTICE : type 8 -- Indirect modify of overloaded property Foo::$barMagic has no effect -- at line XX”
标签: php overloading magic-methods