Абстрактни методи в ООП в 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 направете абстрактни
методи за получаване на площ и периметър на фигурата.