我遇到了我无法解释的代码问题。我唯一能想到的是魔术方法在ArrayObjects中不起作用。例如,给定以下类:
class foo extends ArrayObject {
public $bar = '@@@';
public function __construct() {
parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS);
}
public function __get($prop) {
return '@@@';
}
}
以下几行给出了一个错误“通知:未定义索引:测试...”
$foo = new foo();
echo $foo->test;
然而这些线条运作良好:
$foo = new foo();
echo $foo->bar;
我疯了还是这个已知的问题?
答案 0 :(得分:3)
您正在寻找的“神奇”功能称为offsetGet
Docs,而不是__get
:
class foo extends ArrayObject {
public $bar = '@@@';
public function __construct() {
parent::__construct(array(), ArrayObject::ARRAY_AS_PROPS);
}
public function offsetGet($prop)
{
if (!parent::offsetExists($prop))
return '@@@';
return parent::offsetGet($prop);
}
}
$foo = new foo();
echo $foo->test; # @@@
我肯定不知道,但是__get
不可用,因为你从一个以某种方式阻止它的内部类扩展。