#php #magic-methods
#php #magic-методы
Вопрос:
У меня есть класс, расширенный ArrayObject
с помощью magic more magic:
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
, его __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) "VortexArrayObjectMagic"
object(VortexArrayObjectMagic)#7 (1) {
["storage":"ArrayObject":private]=>
array(0) {
}
}
Undefined index: abcdefg
NULL
string(11) "-----------"
string(23) "VortexArrayObjectMagic"
object(VortexArrayObjectMagic)#8 (1) {
["storage":"ArrayObject":private]=>
array(0) {
}
}
object(VortexArrayObjectMagic)#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
.
Какая-то магия в магии…
Комментарии:
1. я думаю, что то, что разрушает всю магию, — это
ArrayObjectMagic::ARRAY_AS_PROPS
флаг… но как это исправить?
Ответ №1:
Вы возвращаете только новый экземпляр ArrayObjectMagic .
Я думаю, вы хотели что-то вроде этого:
public function __get($name) {
$magic = new ArrayObjectMagic();
return $magic->$name;
}
Комментарии:
1. нет, я не хотел) но это также не решение, потому что, как вы можете видеть, код перед ‘————‘ работает нормально
2. Джимми написал хорошее решение.. единственная проблема в том, что это
new ArrayObjectMagic()
должно быть в constructor __call, а не в методе get. _метод _get должен быть простоreturn $magic->$name;
и ничего больше.3. о, я понял. да, это решение!) извините меня, @jimmy-t, и большое спасибо)