PHP: class A{ public $user; function __set($n,$v){ $this->user[$n] = $v; } function __get($n){ return $this->user[$n]; } } $o = new A(); $o->name = "John"; echo $o->name; Когда интепретатор PHP увидел в коде что мы обращаемся к неизвестному свойству, он обратился в класс, с надеждой найти функцию __set() Эта функция имеет 2 параметра: 01)Название свойства; 02)Значение свойства. В этом месте кода, как переменная $user, которая была объявлена как приватное свойство в классе, как она могла превратится в массив если она была объявлена как обычное закрытое свойство? PHP: function __set($n,$v){ $this->user[$n] = $v; } В этом месте кода, если функция __get() вызывается только в том случаи когда была вызвана функция __set() и в функцию __get() передаётся значение свойства, то значение, которое попало в __set(). Как снова туда может лететь массив ,если функция ГЭТ принимает только свойство класса? PHP: function __get($n){ return $this->user[$n]; }
В примере она объявлена публичной. Вообще для php вполне нормально создавать/превращать переменные в массив при присвоении типа: PHP: <?php $user[$n] = $v; После вызова __set переменная $this->user уже массив.
То есть получается переопределили переменную с неизвестного типа public $user; переопределили в массив внутри функции __set()?
Есть подозрение что тип у переменной вполне известный. Попробуйте: PHP: <?php class A{ public $user; function __set($n,$v){ echo 'До присвоения<br>'; var_dump($this->user); $this->user[$n] = $v; echo 'После присвоения<br>'; var_dump($this->user); } function __get($n){ return $this->user[$n]; } } $o = new A(); $o->name = "John"; echo $o->name;
Попробовал сделать вот так, такое не сработало, тоже переопределить захотел. PHP: $u = 5; $m = "Салат"; echo $m[$u];
Конечно не сработало. В первом случае происходит присвоение переменной, во втором обращение к переменной, т.е. переменная $this->user[$n] создается, а переменную $m[$u] интерпретатор найти не может.
Сработало только вот так: PHP: $u = 5; $m = "Салат"; $m[$u] = $u; echo $m[$u]; Почему? Разве так правильно писать $m[$u] = $u;?