Maison >développement back-end >tutoriel php >Abstraction et interface de partie PHP POO
Dans cette série, je couvrirai les principes fondamentaux de la programmation orientée objet (POO) PHP. Le contenu sera organisé en parties séquentielles, chacune se concentrant sur un sujet spécifique. Si vous êtes débutant ou si vous n'êtes pas familier avec les concepts de POO, cette série est conçue pour vous guider étape par étape. Dans cette partie, je discuterai de l'abstraction et de l'interface en PHP. Commençons ensemble le voyage d’apprentissage de PHP OOP !
Nous savons qu'en programmation orientée objet, l'abstraction est un concept important. Alors, qu’est-ce que l’abstraction ? L'abstraction fait référence au fait de masquer les détails de mise en œuvre d'un programme, en affichant uniquement ses fonctionnalités.
Essayons maintenant de comprendre comment fonctionne l'abstraction en PHP. Tout d’abord, nous examinerons un exemple simple dans lequel il y aura une classe parent et une ou plusieurs classes enfants hériteront de cette classe parent. Après cela, nous discuterons des inconvénients de cette approche.
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
Ici, nous pouvons voir que la classe Vehicle est héritée par les classes Car et Bike. En conséquence, ces deux classes ont accès aux méthodes présentes dans la classe Vehicle. Cependant, il y a un problème : les méthodes de la classe parent sont livrées avec leurs implémentations, dont héritent les classes enfants. Cela signifie que toutes les classes enfants partageront une implémentation commune et se comporteront de la même manière. Mais cela ne devrait pas être le cas car le comportement d’une voiture devrait être différent de celui d’un vélo. Cependant, puisque nous avons hérité des méthodes de la classe parent, les deux classes se comportent de la même manière.
Maintenant, que pouvons-nous faire si, après avoir hérité de ces méthodes communes, nous souhaitons qu'elles se comportent différemment pour chaque classe ?
Pour résoudre ce problème, PHP fournit la classe Abstract. Qu'est-ce qu'une classe abstraite ?
Une classe abstraite est un type de classe qui peut avoir à la fois des méthodes abstraites et des méthodes non abstraites. Alors, que sont les méthodes abstraites et non abstraites ?
Les méthodes abstraites sont des méthodes qui n'ont qu'une définition mais aucune implémentation. Par conséquent, lorsqu'une classe enfant hérite de la classe parent, elle doit fournir une implémentation pour les méthodes abstraites de la classe parent.
Les méthodes non abstraites sont des méthodes qui ont à la fois une définition et une implémentation dans la classe parent. La classe enfant hérite simplement de ces méthodes et peut les utiliser.
Maintenant, nous allons essayer de résoudre le problème ci-dessus en utilisant une classe abstraite.
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
Ici, nous pouvons voir qu'il existe une classe nommée Vehicle. Si nous voulons créer une classe abstraite, nous devons utiliser le mot-clé abstract avant le nom de la classe. La classe Vehicle est donc une classe abstraite. De même, si nous voulons créer une méthode dans une classe abstraite, nous devons utiliser le mot-clé abstract avant le nom de la méthode. Il est important de noter que si nous voulons rendre abstrait n’importe quel membre d’une classe, cette classe doit également être une classe abstraite.
Désormais, les méthodes abstraites héritées de la classe Vehicle ont été implémentées différemment dans chaque classe enfant. En conséquence, ces méthodes se comporteront différemment et fourniront des résultats différents pour chaque classe enfant.
Maintenant, on pourrait se demander pourquoi nous avons dû abstraire les méthodes getBaseFare et getPerKiloFare dans la classe parent alors que nous aurions pu simplement les implémenter directement dans les classes enfants.
Si vous y prêtez attention, vous remarquerez que dans la classe parent, les méthodes getBaseFare et getPerKiloFare sont utilisées au sein d'une autre méthode. Mais si nous n'avions pas abstrait getBaseFare et getPerKiloFare et ne les avions implémentés que dans les classes enfants, nous n'y aurions pas eu accès dans la classe parent. Par conséquent, les méthodes auxquelles les classes parent et enfant doivent accéder, et dont le comportement doit être différent dans chaque classe enfant, sont abstraites.
Il est important de noter qu’une classe abstraite ne peut pas être instanciée directement. Au lieu de cela, on y accède via la classe enfant, et les méthodes abstraites héritées de la classe abstraite doivent être implémentées dans la classe enfant. Si cela n’est pas fait, rien ne fonctionnera dans la classe enfant. J'espère que cela vous permettra de mieux comprendre comment utiliser les classes abstraites.
Dans la discussion précédente, nous avons parlé de classes abstraites. De là, nous avons appris que lorsqu’on hérite de méthodes abstraites d’une classe abstraite, ces méthodes doivent être implémentées dans la classe enfant ; sinon, rien dans la classe enfant ne fonctionnera.
Mais que se passe-t-il si, dans une classe enfant, l'une des méthodes abstraites n'est pas nécessaire, mais qu'elle doit quand même être implémentée ? Ce ne serait pas une bonne solution. Alors, que pouvons-nous faire dans ce cas ?
Dans cette situation, on peut utiliser des interfaces. Une interface est similaire à une classe abstraite, mais une classe abstraite n'est pas entièrement abstraite car, comme nous le savons, une classe abstraite peut avoir à la fois des membres abstraits et non abstraits.
En revanche, une interface ne peut avoir que des membres abstraits. En conséquence, une interface est considérée comme une classe entièrement abstraite. Maintenant, nous allons essayer de résoudre le problème ci-dessus en utilisant une interface.
class Vehicle { public function getBaseFare() { // implementation } public function getPerKiloFare() { // implementation } public function getTotalFare() { // implementation } } class Car extends Vehicle { // Car implementation } class Bike extends Vehicle { // Bike implementation }
Ici dans l'interface, nous voyons la déclaration de la fonction getHourlyRate. Ensuite, dans la classe Car, nous utilisons (implémentons ou héritons) cette interface et fournissons l'implémentation de la méthode abstraite à l'intérieur de l'interface. Cependant, dans la classe Bike, nous n'avons pas eu à implémenter cette méthode car nous n'avons pas utilisé (implémenté ou hérité) l'interface de la classe Bike. Mais si cette méthode abstraite avait été dans une classe abstraite, nous aurions été obligés de l’implémenter dans les deux classes enfants, même si elle n’était pas nécessaire, ce qui aurait abouti à une mauvaise conception. De plus, les interfaces ont divers autres cas d'utilisation.
J'espère que cet épisode vous a permis d'acquérir une compréhension de base des sujets abordés. C'est tout pour aujourd'hui. Nous en reparlerons dans la prochaine leçon.
Vous pouvez me contacter sur GitHub et Linkedin.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!