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 :
<?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 :
<?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 :
<?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 :
<?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 :
<?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
?>
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.