Classes abstraites en POO en PHP

Supposons que vous ayez une classe User, et que les classes Employee et Student en héritent.

Dans ce cas, il est prévu que vous créerez des objets des classes Employee et Student, mais pas d'objets de la classe User, car cette classe est utilisée uniquement pour grouper les propriétés et méthodes communes de ses descendants.

Dans ce cas, vous pouvez interdire de force la création d'objets de la classe User, afin que vous ou un autre programmeur ne les créiez pas accidentellement quelque part.

Pour cela, il existe ce qu'on appelle les classes abstraites. Les classes abstraites sont des classes destinées à être héritées. En revanche, il est impossible de créer des objets de telles classes.

Pour déclarer une classe comme abstraite, vous devez écrire le mot-clé abstract lors de sa déclaration :

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

Alors, écrivons l'implémentation de la classe abstraite User. Supposons qu'elle ait une propriété privée name, ainsi que des getters et setters pour celle-ci :

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

Toute tentative de créer un objet de la classe User provoquera une erreur :

index.php<?php
  $user = new User; // provoquera une erreur
?>

En revanche, il sera possible d'hériter de notre classe. Créons une classe Employee qui héritera de notre classe abstraite User :

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

Créeons un objet de la classe Employee - tout fonctionnera :

index.php<?php
  $employee = new Employee;
  $employee->setName('john');  // méthode du parent, c'est-à-dire de la classe User
  $employee->setSalary(1000);  // sa propre méthode, c'est-à-dire de la classe Employee
  
  echo $employee->getName();   // affichera 'john'
  echo $employee->getSalary(); // affichera 1000
?>
Задание 1

Créez une classe abstraite Figure, représentant une figure géométrique. Que les classes pour le cercle, le rectangle et le carré en héritent.