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

Да предположим, че имате клас User, а от него наследяват класове Employee и Student.

Като се предполага, че ще създавате обекти от класове Employee и Student, но обекти от клас User - няма да създавате, тъй като този клас се използва само за групиране на общи свойства и методи на неговите наследници.

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

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

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

User.php<?php
  abstract class User
  {
    
  }
?>

И така, нека напием реализация на абстрактния клас User. Да предположим, че той има частно свойство name, както и гетъри и сетъри за него:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
  }
?>

Опит за създаване на обект от клас User ще предизвика грешка:

index.php<?php
  $user = new User; // ще даде грешка
?>

Но наследяването от нашия клас ще е възможно. Нека направим клас Employee, който ще наследява от нашия абстрактен клас User:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
  }
?>

Нека създадем обект от клас Employee - всичко ще работи:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // метод на родителя, т.е. на клас User
  $employee->setSalary(1000);  // собствен метод, т.е. на клас Employee
  
  echo $employee->getName();   // ще изведе 'john'
  echo $employee->getSalary(); // ще изведе 1000
?>
Задание 1

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