Abstraktné triedy v OOP v PHP

Nech máte triedu User, a z nej dedia triedy Employee a Student.

Pričom sa predpokladá, že budete vytvárať objekty tried Employee a Student, ale objekty triedy User - nebudete, pretože táto trieda sa používa len na zoskupenie spoločných vlastností a metód svojich dedičov.

V tomto prípade môžete nútene zakázať vytvárať objekty triedy User, aby ste vy alebo iný programátor niekde ich náhodou nevytvorili.

Na to existujú takzvané abstraktné triedy. Abstraktné triedy predstavujú triedy, určené na dedenie od nich. Pričom objekty takých tried nemožno vytvoriť.

Na to, aby ste deklarovali triedu ako abstraktnú, potrebujete pri jej deklarácii napísať kľúčové slovo abstract:

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

Takže, poďme napísať implementáciu abstraktnej triedy User. Nech má súkromnú vlastnosť name, a taktiež gettre a settre pre ňu:

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

Pokus o vytvorenie objektu triedy User spôsobí chybu:

index.php<?php
  $user = new User; // vypíše chybu
?>

Ale zdediť od našej triedy bude možné. Urobme triedu Employee, ktorá bude dediť od našej abstraktnej triedy User:

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

Vytvorme objekt triedy Employee - všetko bude fungovať:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // metóda rodiča, t.j. triedy User
  $employee->setSalary(1000);  // vlastná metóda, t.j. triedy Employee
  
  echo $employee->getName();   // vypíše 'john'
  echo $employee->getSalary(); // vypíše 1000
?>
Задание 1

Urobte abstraktnú triedu Figure, ktorá predstavuje geometrický útvar. Nech z nej dedia triedy pre kruh, obdĺžnik a štvorec.