我有一个课程,从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) {
}
}
为什么?唯一的问题是,我的Config
对ArrayObjectMagic
做的是这种方法:
protected function getArrayValue($array = array()) {
if ($this->use_array_object) {
return new ArrayObjectMagic($array, ArrayObjectMagic::ARRAY_AS_PROPS);
} else {
return $array;
}
}
,但不知何故打破了__get
。
某种神奇的魔法......
答案 0 :(得分:3)
您只返回一个新的ArrayObjectMagic实例。
我想你想要这样的东西:
public function __get($name) {
$magic = new ArrayObjectMagic();
return $magic->$name;
}