PHP Волшебное поведение magic __get

#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, и большое спасибо)