Абстрактыя метады ў ААП у 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. Toлькі цяпер наш метад будзе павялічваць ужо стыпендыю:

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 зрабіце абстрактныя метады для атрымання плошчы і перыметра фігуры.