PHP OOP - Classes abstraites
PHP - Que sont les classes abstraites et les méthodes ?
Les classes et méthodes abstraites sont lorsque la classe parent a une méthode nommée, mais a besoin de sa ou ses classes enfant pour remplir 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 déclarée mais non implémentée dans le code.
Une classe ou une méthode abstraite est définie avec le mot- abstract
clé :
Syntaxe
<?php
abstract class
ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract
public function someMethod3() : string;
}
?>
Lors de l'héritage d'une classe abstraite, la méthode de la classe enfant doit être définie avec le même nom et le même modificateur d'accès ou un modificateur d'accès moins restreint. 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 en plus des arguments facultatifs.
Ainsi, lorsqu'une classe enfant est héritée d'une classe abstraite, nous avons les règles suivantes :
- La méthode de classe enfant doit être définie avec le même nom et elle redéclare la méthode abstraite parent
- La méthode de la classe enfant doit être définie avec le même modificateur d'accès ou un modificateur d'accès moins restreint
- 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
// Parent class
abstract class Car {
public
$name;
public
function __construct($name) {
$this->name = $name;
}
abstract public function intro() : string;
}
// Child classes
class
Audi extends Car {
public
function intro() : string {
return "Choose German
quality! I'm an $this->name!";
}
}
class
Volvo extends Car {
public
function intro() : string {
return "Proud to be
Swedish! I'm a $this->name!";
}
}
class
Citroen extends Car {
public
function intro() : string {
return "French
extravagance! I'm a $this->name!";
}
}
// Create objects from the child classes
$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();
?>
Exemple expliqué
Les classes Audi, Volvo et Citroën sont héritées de la classe Car. Cela signifie que les classes Audi, Volvo et Citroën peuvent utiliser la propriété publique $name ainsi que la méthode publique __construct() de la classe Car en raison de l'héritage.
Mais, intro() est une méthode abstraite qui doit être définie dans toutes les classes enfants et elles doivent renvoyer 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 {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs.";
} else {
$prefix = "";
}
return
"{$prefix} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Regardons un autre exemple où la méthode abstraite a un argument, et la classe enfant a deux arguments facultatifs qui ne sont pas définis dans la méthode abstraite du parent :
Exemple
<?php
abstract class ParentClass {
// Abstract method
with an argument
abstract protected
function prefixName($name);
}
class ChildClass extends ParentClass {
// The child class may define optional arguments that are not in the parent's
abstract method
public function prefixName($name, $separator = ".",
$greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix =
"Mrs";
} else {
$prefix = "";
}
return
"{$greet} {$prefix}{$separator} {$name}";
}
}
$class = new ChildClass;
echo $class->prefixName("John
Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>