Есть 3 класса: PHP: class A{ private $var; public function __get($name){ } public function __set($name, $value){ } } class B extends A { } class C extends B { // нужно через __set() присвоить $var значение } И что-то я не пойму как присвоить $var значение. Понятное дело можно создать отдельный метод в классе A, к примеру так: PHP: protected function setVar($val){ $this->var = $val; } и в классе С просто сделать Код (Text): $this->setVar('test'); либо просто сделать в классе A свойство $var , public или protected и уже в классе C объявить public $var = 'test' или в том же классе C в каком-то методе $this->var = 'test' Но интересно, как это можно сделать через __set()
Магические методы - это такие же методы, как все остальные. Просто вызываются при определённых условиях. __set вызывается при попытке присвоения полю класса, которое в нём вообще не объявлено (ни как protected, ни как private, ни как public). Поэтому делается как-то так: PHP: class A{ private $_var; public function __get($name){ return $name === "var" ? $this->_var : null; } public function __set($name, $value) { if ($name === "var") { $this->_var = $value; } } } Но, вообще, обычно в классах, использующих __get и __set содержится ассоциативный массив, в который и записываются значения. Но магией лучше не злоупотреблять
С этим понял, но как тогда к ним обращаться в цепочке наследований из того же класса C ? $this->__set($name, $value); ???
Т.е. следуя из описания документации, при обращении к закрытому свойству, происходит перехват этого обращения. Всё верно?
Ха, проверил, оказывается был не прав. При обращении к приватным свойствам тоже вызовется __set, если он объявлен. Но всё равно, делают подчёркивание для таких свойств, чтоб лучше читалось. Но оказывается можно и не делать
Код (Text): class A { private $var; public function __set($name, $value) { echo 'Установили ' . $name . ' значение' . $value; $this -> var = $value; } public function __get($name) { return $this -> var; } } $obj = new A; $obj -> var = ' set метода'; echo '<br>'; echo $obj -> var;