Classes et méthodes abstraites en PHP. Classes et méthodes finales en PHP.
#1
Classes et méthodes abstraites en PHP
Une classe abstraite est une classe qui contient au moins une méthode qui ne peut pas être finalisée dans la classe. On ne peut pas la coder à ce stade.
Ci-dessous un exemple :
J'ai une classe Individu
qui contient une méthode seVetir()
que je ne peux pas finaliser, car elle n'est pas suffisamment spécialisée. J'estime que les hommes se vêtissent différemment des femmes 🙃.
Contrairement à la méthode seNourrir()
que je peux coder, parce que j'estime que tous les individus se nourrissent de la même manière.
Ce n'est qu'un exemple 😉.
PHP me permet de gérer cette situation. J'ai la possibilité de ne pas terminer le codage de cette méthode. J'ai la possibilité de dire à PHP que cette méthode est abstraite, qu'elle n'est pas encore suffisamment concrète.
Pour ça je mets le mot réservé abstract
devant le public
de public function seVetir()
et je supprime le corps de cette méthode. Il me reste ce que l'on appelle une signature.
PHP impose que s'il y a une méthode abstraite dans une classe, alors la classe elle-même doit être déclarée abstraite.
Si je veux respecter les PSRs, je dois mettre le mot réservé abstract
devant la déclaration de visibilité de la méthode. Voir les conventions de codage des PSRs. Je dois aussi mettre Abstract
devant le nom de la classe. Voir les conventions de nommage des PSRs (règle numéro 2).
Du coup cela ne sert à rien d'instancier la classe abstraite puisqu'une méthode de la classe n'est pas codée. Ca tombe bien, PHP interdit d'instancier une classe abstraite.
Si la méthode abstraite n'est pas codée, hé bien, il va falloir que je la surcharge dans une classe fille.
Je dirais même que, si la méthode doit être spécialisée, alors c'est qu'il y a plusieurs cas possibles. Il y aura donc de grandes chances pour qu'il y ait au moins deux filles. Toutefois, rien de tout cela n'est imposé par PHP.
Je vais donc créer deux classes filles. La classe Homme
et la classe Femme
.
Et je vais décréter que les hommes doivent mettre des pantalons et les femmes des jupes 🙃.
Nous sommes donc dans une configuration de design particulière.
- Nous avons, d'une part, une classe mère avec un tronc commun de propriétés et de méthodes, et avec en plus, une ou plusieurs signatures abstraites.
- Nous avons, d'autre part, des classes filles (deux ou plus) qui doivent implémenter les signatures selon leurs spécialisations. Toute nouvelle classe fille devra implémenter les signatures.

#2
Respecter une signature
Dans une classe fille, au moment où vous implémentez une signature, vous ne pouvez pas changer grand-chose à la déclaration qui est faite dans la classe mère.
Vous avez ci-dessous, le récapitulatif de ce qui ne doit pas être changé et de ce qui peut l'être. Toutes ces contraintes sont testées dans le tuto vidéo.
Vous devez respecter :
- Le nombre de paramètres.
- Le type des paramètres.
- La présence d’une valeur par défaut sur un paramètre.
- Le type de la valeur de retour.
Vous pouvez changer :
- Mettre protected dans la mère et public dans la fille.
- La valeur par défaut d’un paramètre.
- PHP vous laisse changer le nom d’un paramètre (très déconseillé, mais PHP ne l'empêche pas).
#3
Classes et méthodes finales en PHP
Une méthode finale ne peut pas être surchargée. Une classe finale ne peut pas être étendue.
Ci-dessous, dans la classe fille Homme
, j'empêche que la méthode seVetir()
ne soit surchargée dans une nouvelle classe fille. Ensuite, je vais plus loin, j'empêche que la classe Femme
ne soit étendue.
Pour une méthode finale, le mot réservé final
doit être devant la déclaration de visibilité si vous voulez respecter les PSRs. Voir les conventions de codage des PSRs.