Апстрактне класе у ООП у 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, која представља геометријску фигуру. Нека од ње наслеђују класе за круг, правоугаоник и квадрат.