Veuillez expliquer quand je devrais utiliser une interface
PHP et quand je devrais utiliser une classe abstraite
?
Comment puis-je transformer ma classe abstraite
en une interface
?
Veuillez expliquer quand je devrais utiliser une interface
PHP et quand je devrais utiliser une classe abstraite
?
Comment puis-je transformer ma classe abstraite
en une interface
?
Utilisez une interface lorsque vous voulez forcer les développeurs travaillant dans votre système (vous y compris) à implémenter un certain nombre de méthodes dans les classes qu'ils construiront.
Utilisez une classe abstraite lorsque vous voulez forcer les développeurs travaillant dans votre système (vous y compris) à implémenter un certain nombre de méthodes et que vous voulez fournir quelques méthodes de base qui les aideront à développer leurs classes filles.
Autre chose à garder à l'esprit est que les classes clientes ne peuvent étendre qu'une seule classe abstraite, tandis qu'elles peuvent implémenter plusieurs interfaces. Ainsi, si vous définissez vos contrats de comportement dans des classes abstraites, cela signifie que chaque classe fille ne peut se conformer qu'à un seul contrat. Parfois, c'est une bonne chose, lorsque vous voulez contraindre vos utilisateurs-programmeurs à suivre un chemin particulier. D'autres fois, cela pourrait être nuisible. Imaginez si les interfaces Countable et Iterator de PHP étaient des classes abstraites au lieu d'interfaces.
Une approche courante lorsque vous n'êtes pas certain du chemin à suivre (comme mentionné par cletus ci-dessous) est de créer une interface, puis d'avoir votre classe abstraite implémenter cette interface.
J'ai passé toute la journée à essayer de comprendre les utilisations des classes abstract
et interface
, votre publication a tout rendu clair. Merci beaucoup Alan
Un autre avantage des classes abstraites est la possibilité de définir des méthodes protégées abstraites. Pas toujours utiles, mais peuvent être pratiques dans certaines architectures.
Donc dans de nombreux cas, nous devrions utiliser une classe abstraite en raison de sa souplesse - voilà ma conclusion :)
Les différences entre une Classe Abstraite
et une Interface
:
Classes Abstraites
Une classe abstraite peut fournir une certaine fonctionnalité et laisser le reste pour la classe dérivée.
La classe dérivée peut ou non remplacer les fonctions concrètes définies dans la classe de base.
Une classe enfant étendue à partir d'une classe abstraite devrait être logiquement liée.
Interface
Une interface ne peut contenir aucune fonctionnalité. Elle contient uniquement des définitions des méthodes.
La classe dérivée DOIT fournir du code pour toutes les méthodes définies dans l'interface.
Des classes complètement différentes et non liées peuvent être regroupées logiquement à l'aide d'une interface.
@Webinan Dans abstract class X implements Y
, vous déclarez que la fonctionnalité principale de X doit être implémentée dans une classe dérivée et que la classe abstraite et dérivée doivent toutes deux contenir des fonctions définies dans Y, tandis que class X implements Y
implique seulement que la classe X doit contenir des fonctions définies dans Y. Si votre interface Y n'est pas censée être implémentée par une autre classe que X, je conseille en fait de ne pas définir Y en tant qu'interface et de simplement implémenter les fonctions de Y comme des fonctions abstraites publiques/protégées/privées pour vous assurer qu'elles sont implémentées dans la classe dérivée.
Pourquoi utiliser des classes abstraites? Voici un exemple simple provenant de https://www.php.net/manual/en/language.oop5.abstract.php#95404 par l'utilisateur mbajoras.
Disons que nous avons le code suivant:
color = $c; } } class Apple extends Fruit { public function eat() { // mâcher jusqu'au trognon } } class Orange extends Fruit { public function eat() { // éplucher // mâcher } }
Maintenant je vous donne une pomme et vous la mangez. A quoi ça goûte? Ça goûte une pomme.
eat(); // Maintenant je vous donne un fruit. $fruit = new Fruit(); $fruit->eat();
A quoi ça goûte? Eh bien, ça n'a pas beaucoup de sens, donc vous ne devriez pas pouvoir le faire. Cela est réalisé en rendant la classe Fruit abstraite ainsi que la méthode eat à l'intérieur.
color = $c; } } ?>
Une classe abstraite est comme une interface, mais vous pouvez définir des méthodes dans une classe abstraite tandis que dans une interface elles sont toutes abstraites.
Les classes abstraites peuvent avoir à la fois des méthodes vides et des méthodes fonctionnelles/concrètes. Dans les interfaces, les fonctions définies là-bas ne peuvent pas avoir de corps. Dans les classes abstraites, elles le peuvent.
Un exemple dans le monde réel:
LastName . " dans la table de la base de données des employés ";
}
}
final class student extends person{
public $StudentNumber;
public $CourseName;
public function write_info(){
// codes sql ici
echo "Écriture des informations de ". $this->LastName . " dans la table de la base de données des étudiants ";
}
}
///----------
$personA = new employee;
$personB = new student;
$personA->FirstName="Joe";
$personA->LastName="Quelqu'un";
$personB->FirstName="Ben";
$personB->LastName="Dover";
$personA->write_info();
// Écriture des informations de Quelqu'un dans la table de la base de données des employés
$personB->write_info();
// Écriture des informations de Dover dans la table de la base de données des étudiants
Salut, cette réponse a probablement été mal notée en raison de la façon dont elle est formatée. Ce serait bien si ce n'était pas un grand bloc de code (quatre espaces font quelque chose dans un bloc de code, désindentez le texte pour le sortir du bloc), et si cela a été copié-collé de quelque part (cela semble être le cas), il serait poli de les créditer.
Je t'aime pour l'exemple de fruit, mec ! Depuis que j'ai commencé à apprendre le PHP, ces exemples me sont très utiles, merci beaucoup.
+1 À quoi ça goûte ? Eh bien, ça n'a pas beaucoup de sens, donc tu ne devrais pas pouvoir faire ça.
Maintenant je sais ce qu'est l'abstraction !
La meilleure pratique est d'utiliser une interface pour spécifier le contrat et une classe abstraite comme une seule implémentation de celui-ci. Cette classe abstraite peut remplir une grande partie du code boilerplate afin que vous puissiez créer une implémentation en ne surchargeant que ce que vous avez besoin ou voulez sans vous obliger à utiliser une implémentation particulière.
Juste pour ajouter ceci dans le mélange, mais comme l'a mentionné Cletus en utilisant une interface en conjonction avec une classe abstraite, j'utilise souvent l'interface pour clarifier ma réflexion de conception.
Par exemple:
`
Ainsi, toute personne lisant mon code (et qui sait ce qu'est un pattern Décorateur) saura immédiatement a) comment je construis mon analyseur et b) pourra voir quelles méthodes sont utilisées pour implémenter le pattern décorateur.
Aussi, et je peux me tromper en n'étant pas programmeur Java/C++/etc, mais les types de données peuvent entrer en jeu ici. Vos objets sont d'un type, et lorsque vous les passez autour, le type a de l'importance programmation. Déplacer vos éléments contractables dans l'interface ne dicte que les types que les méthodes renvoient, mais pas le type de base de la classe qui l'implémente.
Il est tard et je ne peux pas penser à un meilleur exemple de pseudo-code, mais voici:
`
@matt2000 Pas sexiste ET fonctionne aussi pour les mariages de même sexe maintenant. Super édition. :)
Ceci est un exemple génial! Cependant, je ne pense pas que vous puissiez instancier une classe abstraite mais plutôt une classe qui étend une classe abstraite.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.