PHP OOP - Classes Abstraites


PHP - Qu'est-ce que les Classes et Méthodes Abstraites ?

Les classes et méthodes abstraites sont celles où la classe parente a une méthode nommée, mais nécessite que ses classes enfants remplissent les tâches.

Une classe abstraite est une classe qui contient au moins une méthode abstraite. Une méthode abstraite est une méthode qui est déclarée, mais non implémentée dans le code.

Une classe ou méthode abstraite est définie avec le mot-clé abstract :

Syntaxe

<?php
abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}
?>

Lorsqu'on hérite d'une classe abstraite, la méthode de la classe enfant doit être définie avec le même nom et le même ou un modificateur d'accès moins restrictif. Ainsi, si la méthode abstraite est définie comme protégée, la méthode de la classe enfant doit être définie comme protégée ou publique, mais pas privée. De plus, le type et le nombre d'arguments requis doivent être identiques. Cependant, les classes enfants peuvent avoir des arguments optionnels en plus.

Ainsi, lorsqu'une classe enfant hérite d'une classe abstraite, nous avons les règles suivantes :

  • La méthode de la classe enfant doit être définie avec le même nom et redéclare la méthode abstraite parente.
  • La méthode de la classe enfant doit être définie avec le même ou un modificateur d'accès moins restrictif.
  • Le nombre d'arguments requis doit être le même. Cependant, la classe enfant peut avoir des arguments optionnels en plus.

Regardons un exemple :

Exemple

<?php
// Classe parente
abstract class Car {
public $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}

// Classes enfants
class Audi extends Car {
public function intro() : string {
return "Choisissez la qualité allemande ! Je suis un $this->name !";
}
}

class Volvo extends Car {
public function intro() : string {
return "Fier d'être suédois ! Je suis un $this->name !";
}
}

class Citroen extends Car {
public function intro() : string {
return "Extravagance française ! Je suis un $this->name !";
}
}

// Créer des objets à partir des classes enfants
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Essayez-le vous-même »

Exemple Expliqué

Les classes Audi, Volvo et Citroen héritent de la classe Car. Cela signifie que les classes Audi, Volvo et Citroen peuvent utiliser la propriété publique $name ainsi que la méthode publique __construct() de la classe Car grâce à l'héritage.

Cependant, intro() est une méthode abstraite qui doit être définie dans toutes les classes enfants et qui doit retourner une chaîne.



PHP - Plus d'Exemples de Classes Abstraites

Regardons un autre exemple où la méthode abstraite a un argument :

Exemple

<?php
abstract class ParentClass {
// Méthode abstraite avec un argument
abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "M.";
} elseif ($name == "Jane Doe") {
$prefix = "Mme.";
} else {
$prefix = "";
}
return "{$prefix} {$name}";
}
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Essayez-le vous-même »

Regardons un autre exemple où la méthode abstraite a un argument, et la classe enfant a deux arguments optionnels qui ne sont pas définis dans la méthode abstraite du parent :

Exemple

<?php
abstract class ParentClass {
// Méthode abstraite avec un argument
abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
// La classe enfant peut définir des arguments optionnels qui ne sont pas dans la méthode abstraite du parent
public function prefixName($name, $separator = ".", $greet = "Cher") {
if ($name == "John Doe") {
$prefix = "M";
} elseif ($name == "Jane Doe") {
$prefix = "Mme";
} else {
$prefix = "";
}
return "{$greet} {$prefix}{$separator} {$name}";
}
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Essayez-le vous-même »