Classi astratte in OOP in PHP

Supponiamo che tu abbia una classe User, e da essa ereditino le classi Employee e Student.

In questo caso, si presuppone che creerai oggetti delle classi Employee e Student, ma non creerai oggetti della classe User, poiché questa classe viene utilizzata solo per raggruppare proprietà e metodi comuni dei suoi eredi.

In questo caso, è possibile vietare forzatamente la creazione di oggetti della classe User, in modo che tu o un altro programmatore non ne crei accidentalmente da qualche parte.

Per questo esistono le cosiddette classi astratte. Le classi astratte sono classi destinate all'ereditarietà da esse. Tuttavia, non è possibile creare oggetti di tali classi.

Per dichiarare una classe astratta, è necessario scrivere la parola chiave abstract nella sua dichiarazione:

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

Quindi, scriviamo l'implementazione di una classe astratta User. Supponiamo che abbia una proprietà privata name, e anche getter e setter per essa:

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

Il tentativo di creare un oggetto della classe User causerà un errore:

index.php<?php
  $user = new User; // darà un errore
?>

Tuttavia, sarà possibile ereditare dalla nostra classe. Creiamo una classe Employee che erediti dalla nostra classe astratta User:

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

Creiamo un oggetto della classe Employee - tutto funzionerà:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // metodo del genitore, cioè della classe User
  $employee->setSalary(1000);  // metodo proprio, cioè della classe Employee
  
  echo $employee->getName();   // visualizzerà 'john'
  echo $employee->getSalary(); // visualizzerà 1000
?>
Задание 1

Crea una classe astratta Figure, che rappresenti una figura geometrica. Lascia che da essa ereditino classi per il cerchio, il rettangolo e il quadrato.