# Обращение к методам класса через $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; // обновим, если новый возраст прошел проверку } } } ?>`

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

`<?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`, который будет выполнять уменьшение текущего возраста на переданное количество лет.

←→
↑