Обращение к методам через $this

Через $this можно обращаться не только к свойствам объекта, но и к его методам. Думаю это уже более-менее понятно, поэтому давайте сразу посмотрим применение на практическом примере.

Пусть у нас есть класс User, а в нем метод setAge для изменения возраста юзера:

<?php class User { public $name; public $age; // Метод для изменения возраста юзера: public function setAge($age) { $this->age = $age; } } ?>

Давайте добавим проверку введенного возраста: если он от 18 до 60, то будем менять возраст на новый, а если нет - то менять не будем:

<?php class User { public $name; public $age; // Метод для изменения возраста юзера: public function setAge($age) { //!! Если возраст от 18 до 60: if ($age >= 18 and $age <= 60) { $this->age = $age; } } } ?>

Пусть также нам нужен метод addAge, который будет добавлять некоторое количество лет к текущему возрасту:

<?php class User { public $name; public $age; // Метод для изменения возраста юзера: public function setAge($age) { // Если возраст от 18 до 60: if ($age >= 18 and $age <= 60) { $this->age = $age; } } //!! Метод для добавления к возрасту: public function addAge($years) { $this->age = $this->age + $years; } } ?>

В метод addAge, конечно же, также необходимо добавить проверку возраста, сделаем это:

<?php class User { public $name; public $age; // Метод для изменения возраста юзера: public function setAge($age) { // Если возраст от 18 до 60: if ($age >= 18 and $age <= 60) { $this->age = $age; } } // Метод для добавления к возрасту: public function addAge($years) { $newAge = $this->age + $years; // вычислим новый возраст //!! Если НОВЫЙ возраст от 18 до 60: if ($newAge >= 18 and $newAge <= 60) { $this->age = $newAge; // обновим, если новый возраст прошел проверку } } } ?>

Получится, что ограничения на возраст теперь задаются в двух местах (в функции setAge и в функции addAge), что не очень хорошо: если мы захотим поменять ограничение, нам придется сделать это в двух местах - это неудобно, и в каком-то из мест мы можем забыть внести изменения - это опасно, ведь наш код получится с трудноуловимой ошибкой.

Давайте вынесем проверку возраста на корректность в отдельный вспомогательный метод isAgeCorrect, в который параметром будет передаваться возраст для проверки, и используем его внутри методов setAge и addAge:

<?php class User { public $name; public $age; //!! Метод для проверки возраста: public function isAgeCorrect($age) { if ($age >= 18 and $age <= 60) { return true; } else { return false; } } // Метод для изменения возраста юзера: public function setAge($age) { //!! Проверим возраст на корректность: if ($this->isAgeCorrect($age)) { $this->age = $age; } } // Метод для добавления к возрасту: public function addAge($years) { $newAge = $this->age + $years; // вычислим новый возраст //!! Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) { $this->age = $newAge; // обновим, если новый возраст прошел проверку } } } ?>

Теперь любое изменения в условиях проверки можно будет легко сделать в одном месте.

Кстати, более изящно будет переписать метод isAgeCorrect на короткую форму работы с логическими выражениями, вот так:

<?php public function isAgeCorrect($age) { return $age >= 18 and $age <= 60; } ?>

Исправим наш код:

<?php class User { public $name; public $age; // Метод для проверки возраста: public function isAgeCorrect($age) { return $age >= 18 and $age <= 60; } // Метод для изменения возраста юзера: public function setAge($age) { // Проверим возраст на корректность: if ($this->isAgeCorrect($age)) { $this->age = $age; } } // Метод для добавления к возрасту: public function addAge($years) { $newAge = $this->age + $years; // вычислим новый возраст // Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) { $this->age = $newAge; // обновим, если новый возраст прошел проверку } } } ?>

Проверим, что все работает как надо:

<?php $user = new User; $user->setAge(30); // установим возраст в 30 echo $user->age; // выведет 30 $user->setAge(10); // установим некорректный возраст echo $user->age; // не выведет 10, а выведет 30 ?>

Не подсматривая в мой код создайте такой же класс User с такими же методами.

Создайте объект этого класса User, проверьте работу методов setAge и addAge.

Добавьте также метод subAge, который будет выполнять уменьшение текущего возраста на переданное количество лет.