241 votes

Quel est le point d'interface en PHP?

Interfaces vous permettent de créer un code qui définit les méthodes de classes qui l'implémentent. Cependant on ne peut pas ajouter du code à ces méthodes.

Les classes abstraites permettent de faire la même chose, avec l'ajout de code à la méthode.

Maintenant, si vous pouvez atteindre le même but avec les classes abstraites, pourquoi avons-nous besoin de la notion d'interfaces?

J'ai été informé qu'il a à faire avec OO théorie du C++ à Java, qui est ce que PHP OO genre de choses est basé sur. Le concept est utile en Java, mais pas en PHP? Est-il juste un moyen d'éviter d'avoir des espaces réservés jonché dans la classe abstraite? Ai-je raté quelque chose?

148voto

Craig H Points 4224

L'ensemble de point d'interfaces est de vous donner de la flexibilité à votre classe d'être forcé à implémenter plusieurs interfaces, mais encore permet pas l'héritage multiple. Les problèmes avec hériter de plusieurs classes sont nombreuses et variées, et la wikipédia page sur elle résume assez bien.

Les Interfaces sont un compromis. La plupart des problèmes de l'héritage multiple ne s'appliquent pas aux classes de base abstraites, donc la plupart des langues modernes ces jours désactiver l'héritage multiple encore appeler les classes de base abstraites interfaces et permet à une classe de "mettre en œuvre" comme beaucoup de ceux qu'ils le veulent.

128voto

John Downey Points 6729

Le concept est utile partout dans la programmation orientée objet. Pour moi, je considère une interface comme un contrat. Tant que ma classe et votre classe sont d'accord sur ce contrat de signature de méthode que nous pouvons "interfacer". En ce qui concerne les classes abstraites, je considère qu’il s’agit plutôt de classes de base qui éliminent certaines méthodes et que je dois compléter les détails.

81voto

tastro Points 501

Si vous savez que vous allez changer votre base de données dans le futur par exemple, puis un interface est utile. Disons que vous utiliserez MySQL que votre première base de données et dans votre dbclass pour MySQL, vous aurez des méthodes comme la méthode Add(), Remove(), ... Et après un certain temps, vous décidez de la modifier à partir de votre base de données MySQL à Oracle. Alors tout ce que vous devez faire est de créer un autre dbclass pour votre nouveau - Oracle database. Parce que toutes les méthodes qui vous aide dans votre projet restera le même(Add(), Remove(), ...). Seule leur mise en œuvre va changer. De cette façon, vous n'avez pas besoin d'aller à travers l'ensemble de votre code à la recherche pour les méthodes Add() et Remove() pour changer le "interface" reste le même.

25voto

Sam McAfee Points 4615

La différence entre l'utilisation d'une interface et une classe abstraite a plus à voir avec le code de l'organisation pour moi, que l'application par le langage lui-même. J'utilise beaucoup lors de la préparation code pour les autres développeurs de travailler avec de sorte qu'ils restent à l'intérieur de la conception des modèles. Les Interfaces sont une sorte de "conception par contrat" par lequel votre code est d'accord pour répondre à un ensemble défini d'appels d'API qui peut être à venir à partir du code que vous n'avez pas aceess.

Alors que l'héritage de classe abstraite est une "est une" relation, qui n'est pas toujours ce que vous voulez, et de mettre en œuvre une interface est plus un "agit comme une" relation. Cette différence peut être très importante dans certains contextes.

Par exemple, disons que vous avez une classe abstraite Compte de nombreux autres classes d'étendre les types de comptes et ainsi de suite). Il a un ensemble de méthodes qui sont seulement applicables à ce type de groupe. Cependant, certains de ces compte les sous-classes en œuvre Versionable, ou Listable, ou de les modifier de sorte qu'ils peuvent être jetés dans les contrôleurs de s'attendre à l'utilisation de ces Api. Le contrôleur ne se soucient pas de ce type d'objet, il est

En revanche, je peux aussi créer un objet qui ne s'étend pas de Compte, qu'un Utilisateur classe abstraite, et de toujours mettre en œuvre Listable et Modifiable, mais pas Versionable, qui n'a pas de sens ici.

De cette façon, je suis en train de dire que FooUser sous-classe n'est PAS un compte, mais N'agissent comme un objet Modifiable. De même BarAccount s'étend de Compte, mais n'est pas un Utilisateur de la sous-classe, mais met en œuvre Modifiable, Listable et aussi Versionable.

En ajoutant tous ces Api pour Modifiable, Listable et Versionable dans les classes abstraites lui-même ne serait pas seulement être encombré et laid, mais soit de dupliquer les interfaces communes en Compte et l'Utilisateur, ou la force de mon objet Utilisateur à mettre en œuvre Versionable, probablement juste de lancer une exception.

23voto

Ross Points 19037

Les Interfaces sont essentiellement un plan de ce que vous pouvez créer. Ils définissent quelles sont les méthodes d'une classe doit avoir, mais vous pouvez créer des méthodes supplémentaires à l'extérieur de ces limites.

Je ne suis pas sûr de ce que tu veux dire par ne pas être en mesure d'ajouter du code pour les méthodes parce que vous le pouvez. Appliquez-vous à l'interface d'une classe abstraite ou de la classe qui étend la classe?

Une méthode dans l'interface appliquée à la classe abstraite devront être mis en place dans cette classe abstraite. Ne s'applique toutefois que l'interface de l'extension de la classe et de la méthode que les besoins de la mise en œuvre dans le prolongement de la classe. J'ai peut-être tort de ici - je ne pas utiliser les interfaces aussi souvent que je pourrait/devrait.

J'ai toujours pensé que des interfaces comme un modèle pour les développeurs externes ou à un jeu de règles pour vous assurer que les choses sont correctes.

Prograide.com

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.

Powered by:

X