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