Абстрактни методи в ООП в PHP

Абстрактните класове могат също да съдържат абстрактни методи. Такива методи не трябва да имат реализация, а са необходими, за да посочат, че такива методи трябва да има в наследниците. А самата реализация на тези методи - вече е задача на наследниците.

За да декларирате метод като абстрактен, при неговата декларация трябва да напишете ключовата дума abstract.

Нека опитаме на практика. Да предположим, че всички наследници на класа User трябва да имат метод increaseRevenue.

Този метод трябва да вземе текущия доход на потребителя и да го увеличи с определена стойност, подадена като параметър.

Самият клас User не знае какъв точно доход ще получава наследникът - все пак при служителя това е заплата, а при студента - стипендия. Следователно всеки наследник ще реализира този метод по свой собствен начин.

Същността тук е, че абстрактният метод на класа User принуждава програмиста да реализира този метод в наследниците, в противен случай PHP ще даде грешка. По този начин вие, или друг програмист, който работи с вашия код, няма да можете да забравите да реализирате необходимия метод в наследника.

И така, нека опитаме на практика. Нека добавим абстрактен метод increaseRevenue в класа User:

User.php<?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:

Employee.php<?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;
    }
  }
?>

Нека проверим работата на нашия клас:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');
  $employee->setSalary(1000);
  $employee->increaseRevenue(100);
  
  echo $employee->getSalary();
?>

Нека реализираме метода increaseRevenue и в класа Student. Само че сега нашият метод ще увеличава вече стипендията:

Student.php<?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;
    }
  }
?>
Задание 1

Добавете във вашия клас User същия абстрактен метод increaseRevenue. Напишете реализация на този метод в класовете Employee и Student.

Задание 2

В класа Figure направете абстрактни методи за получаване на площ и периметър на фигурата.