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
– это обновить строку в базе данных. Таким образом, вы меняете то, что не обязательно внутри класса, но используя класс, чтобы упростить его изменение / получение.