魔术方法在ArrayObjects中不起作用?

时间:2011-11-05 04:18:05

标签: php magic-methods arrayobject

我遇到了我无法解释的代码问题。我唯一能想到的是魔术方法在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;

我疯了还是这个已知的问题?

1 个答案:

答案 0 :(得分:3)

您正在寻找的“神奇”功能称为offsetGetDocs,而不是__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不可用,因为你从一个以某种方式阻止它的内部类扩展。