PHP魔法行为的魔法__get

时间:2014-06-21 08:27:35

标签: php magic-methods

我有一个课程,从ArrayObject扩展到魔法更神奇:

class ArrayObjectMagic extends ArrayObject {
    public function __call($method, $args) {
        if (isset($this->$method))
            return $this->$method;
        return isset($args[0]) ? $args[0] : new ArrayObjectMagic();
    }
    public function __get($name) {
        return new ArrayObjectMagic();
    }
}

我将这个课程用于我的Config课程。奇怪的行为是事实,如果在ArrayObjectMagic中创建了Config obj,它的__get魔法不会被激发!让我举个例子:

$a = Config::getInstance();
var_dump(get_class($a));
var_dump($a->abcdefg());
var_dump($a->abcdefg);

var_dump("-----------");

$b = new ArrayObjectMagic();
var_dump(get_class($b));
var_dump($b->abcdefg());
var_dump($b->abcdefg);

输出:

string(23) "Vortex\ArrayObjectMagic"
object(Vortex\ArrayObjectMagic)#7 (1) {
  ["storage":"ArrayObject":private]=>
  array(0) {
  }
}
Undefined index: abcdefg
NULL

string(11) "-----------"

string(23) "Vortex\ArrayObjectMagic"
object(Vortex\ArrayObjectMagic)#8 (1) {
  ["storage":"ArrayObject":private]=>
  array(0) {
  }
}
object(Vortex\ArrayObjectMagic)#8 (1) {
  ["storage":"ArrayObject":private]=>
  array(0) {
  }
}

为什么?唯一的问题是,我的ConfigArrayObjectMagic做的是这种方法:

protected function getArrayValue($array = array()) {
        if ($this->use_array_object) {
            return new ArrayObjectMagic($array, ArrayObjectMagic::ARRAY_AS_PROPS);
        } else {
            return $array;
        }
    }

,但不知何故打破了__get

某种神奇的魔法......

1 个答案:

答案 0 :(得分:3)

您只返回一个新的ArrayObjectMagic实例。

我想你想要这样的东西:

public function __get($name) {
    $magic = new ArrayObjectMagic();
    return $magic->$name;
}