offline version v3
Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
⊗ppOpMgGtNEP 86 of 179 menu

Применение метода __get для несуществующего свойства

В примере, приведенном в предыдущем уроке, мы применяли магию метода __get для отлавливания обращения к приватным свойствам. На самом деле этот метод также может быть полезен для отлавливания обращений к несуществующим свойствам.

Посмотрим на практическом примере. Пусть у нас есть класс User с фамилией, именем и отчеством, являющимися публичными свойствами:

<?php class User { public $surname; public $name; public $patronymic; } $user = new User; $user->surname = 'Иванов'; $user->name = 'Иван'; $user->patronymic = 'Иванович'; ?>

Давайте сделаем так, чтобы объект класса вел себя так, будто у него также есть свойство fullname, выводящее ФИО юзера:

<?php $user = new User; $user->surname = 'Иванов'; $user->name = 'Иван'; $user->patronymic = 'Иванович'; // Выведет 'Иванов Иван Иванович': echo $user->fullname; // это пока не работает, является нашей целью ?>

Используем для этого наш магический метод __get:

<?php class User { public $surname; public $name; public $patronymic; // Используем метод-перехватчик: public function __get($property) { // Если идет обращение к свойству fullname: if ($property == 'fullname') { return $this->surname . ' ' . $this->name . ' ' . $this->patronymic; } } } ?>

Проверим:

<?php $user = new User; $user->surname = 'Иванов'; $user->name = 'Иван'; $user->patronymic = 'Иванович'; echo $user->fullname; // выведет 'Иванов Иван Иванович' ?>

Получается, что с помощью __get мы создали в классе виртуальное свойство: в классе его нет, но прочитать его можно.

Кстати, записать в такое свойство будет нельзя, так как в реальности его не существует в нашем классе. То есть это свойство только для чтения.

Сделайте класс Date с публичными свойствами year, month и day.

С помощью магии сделайте свойство weekDay, которое будет возвращать день недели, соответствующий дате.