PHP __get __set методы

class Dog { protected $bark = 'woof!'; public function __get($key) { if (isset($this->$key)) { return $this->$key; } } public function __set($key, $val) { if (isset($this->$key)) { $this->$key = $val; } } } 

В чем смысл использования этих функций.

если я могу использовать

 $dog = new Dog(); $dog->bark = 'woofy'; echo $dog->bark; 

Почему я должен был объявлять «кору» protected ? __set() методы __get() и __set() в этом случае эффективно, чтобы сделать «кору» общедоступной?

    В этом случае они действительно превращают $this->bark открытую, так как они просто устанавливают и извлекают значение. Однако, используя метод getter, вы можете сделать больше работы в то время, когда оно установлено, например, проверка его содержимого или изменение других внутренних свойств этого класса.

    Не обязательно использовать свойства объекта.

    Вот что делает их могущественными.

    пример

     class View extends Framework { public function __get($key) { if (array_key_exists($key, $this->registry)) { return trim($this->registry[$key]); } } } 

    В принципе, я пытаюсь продемонстрировать, что их не нужно использовать так же, как геттеры и сеттеры для свойств объектов.

    Обычно вы никогда не оставите эти __get и __set точно так же, как вы его оставили.

    Существует много способов использования этих методов. Вот несколько примеров того, что вы могли бы сделать с этими методами.

    Свойства доступны только для чтения:

     protected $bark = 'woof!'; protected $foo = 'bar'; public function __get($key) { if (isset($this->$key)) { return $this->$key; } } public function __set($key, $val) { if ($key=="foo") { $this->$key = $val; //bark cannot be changed from outside the class } } 

    Вы можете делать что-то с данными, которые у вас есть до фактического получения или настройки ваших данных:

     // ... public $timestamp; public function __set($var, $val) { if($var == "date") { $this->timestamp = strtotime($val); } } public function __get($var) { if($var == date) { return date("jS FY", $this->timestamp); } } 

    Еще один простой пример того, что вы можете сделать с __set – это обновить строку в базе данных. Таким образом, вы меняете то, что не обязательно внутри класса, но используя класс, чтобы упростить его изменение / получение.