Применение метода __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,
которое будет возвращать день недели, соответствующий
дате.