Абстрактные методы в ООП в PHP
Абстрактные классы также могут содержать абстрактные методы. Такие методы не должны иметь реализации, а нужны для того, чтобы указать, что такие методы должны быть у потомков. А собственно реализация таких методов - уже задача потомков.
Для того, чтобы объявить метод абстрактным,
при его объявлении следует написать ключевое
слово abstract
.
Давайте попробуем на практике. Пусть предполагается,
что все потомки класса User
должны
иметь метод increaseRevenue
.
Этот метод должен брать текущий доход пользователя и увеличивать его на некоторую величину, переданную параметром.
Сам класс User
не знает, какой именно
доход будет получать наследник - ведь у работника
это зарплата, а у студента - стипендия. Поэтому
каждый потомок будет реализовывать этот метод
по-своему.
Суть тут в том, что абстрактный метод класса
User
заставляет программиста реализовывать
этот метод в потомках, иначе PHP выдаст ошибку.
Таким образом вы, или другой программист,
работающий с вашим кодом, никак не сможете
забыть реализовать нужный метод
в потомке.
Итак, давайте попробуем на практике. Добавим
абстрактный метод increaseRevenue
в класс User
:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Абстрактный метод без тела:
abstract public function increaseRevenue($value);
}
?>
Пусть наш класс Employee
пока останется
без изменений. В этом случае, даже если не
создавать объект класса Employee
,
а просто запустить код, в котором определяются
наши классы, - PHP выдаст ошибку.
Давайте теперь напишем реализацию метода
increaseRevenue
в классе
Employee
:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Напишем реализацию метода:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Проверим работу нашего класса:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Реализуем метод increaseRevenue
и
в классе Student
. Только теперь наш
метод будет увеличивать уже стипендию:
<?php
class Student extends User
{
private $scholarship; // стипендия
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Метод увеличивает стипендию:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Добавьте в ваш класс User
такой же
абстрактный метод increaseRevenue
.
Напишите реализацию этого метода в классах
Employee
и Student
.
В классе Figure
сделайте абстрактные
методы для получения площади и периметра фигуры.