Абстрактные методы в ООП в 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. Toлько теперь наш
метод будет увеличивать уже стипендию:
<?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 сделайте абстрактные
методы для получения площади и периметра фигуры.