9
votes

Des "outils" "Crazy déroutant" PHP "" s'étend "en même temps

abstract class SF_Model_Acl_Abstract 
    extends SF_Model_Abstract
    implements SF_Model_Acl_Interface, Zend_Acl_Resource_Interface
{
    protected $_acl;
    protected $_identity;
    public function setIdentity($identity)
    {
    if (is_array($identity)) {
        ......
        ......
Can you help me explain how it can "implements" "extends" at the same time?
Does it just combine the 3 class together? I am totally confused!

5 commentaires

C'est fondamentalement la même chose. Mais puisque PHP suit un paradigme de OOP plus limité, il ne prend pas en charge plusieurs héritages. Par conséquent, il utilise des signatures de classe vide (= interfaces) et ne prend en charge qu'une seule héritage réelle (= étend la classe).


alors Java suit également une OOP plus limitée;) - Kudos php vous n'êtes pas derrière


L'héritage multiple est considérée comme une mauvaise pratique, car elle conduit à un code vraiment difficile, et nous savons tous: de bonnes choses sont simples. Le monde peut vivre sans elle, l'expérience l'a prouvé.


@Falcon: Je ne veux pas commencer une discussion non pertinente ici, mais la partie "mauvaise pratique" est subjective, la simplicité des interfaces vs vs et le monde peut vivre sans OOP.


@FALCON: Cela peut être une mauvaise fonctionnalité dans les langages de compilation statique en raison de la priorité de la fonction (voir problème de diamant), mais fonctionne assez bien dans les langages de script (voir Python). C2.com/cgi/wiki?MultiLiChheritanceSnotevil - La fonction de traits planifiée dans PHP 5.4 ajoute de manière significative plus Complexité syntaxique et sémantique qu'elle ne tente de résoudre un problème d'éviscération à cause d'un meme surgénéralisé.


5 Réponses :


17
votes

s'étend est destiné à héritage, c'est-à-dire héritant les méthodes / champs de la classe. Une classe PHP ne peut hériter que d'une classe.

Implements est destiné aux interfaces de mise en œuvre. Il est simplement nécessaire que la classe ait les méthodes définies dans les interfaces implémentées.

exemple: xxx

Ce code jette une erreur fatale en ligne 5 Comme méthode de l'interface n'est pas correctement implémentée (Argument manquant). Il lancerait également une erreur fatale dans la ligne 6 car la méthode de l'interface n'est pas mise en œuvre du tout.


2 commentaires

Merci, mec ~ je me sens beaucoup mieux maintenant ... Je suppose que l'astuce consiste à faire une distinction qui s'étend est destinée aux héritages, tandis que des outils pour rendre les fonctions d'interface.


Je viens d'avoir le même problème au travail .. Extension de la classe et en mettant en œuvre un autre 3! Quoi qu'il en soit, il est toujours utile de consulter le manuel PHP sur Héritage et < Un href = "http://php.net/manual/fr/language.oop5.interfaces.php" rel = "Nofollow Noreferrer"> Interfaçage



5
votes

Oui, PHP peut implémenter plusieurs interfaces à l'aide d'outils , mais il peut hériter d'une seule classe en utilisant s'étend


0 commentaires

1
votes

Il implémente simplement des interfaces, qui décrivent quelles méthodes sont nécessaires, d'autres méthodes ont une interface définie à fonctionner, voir http://php.net/manual/fr/language.oop5.interfaces.php


0 commentaires

5
votes

Les outils et s'étend sont deux types de chaussures différentes.

s'étends indique le compilateur / interprète que la classe est dérivée d'une autre classe. Les outils indiquent le compilateur / interprète, que la classe doit mettre en œuvre un contrat, défini dans une interface.

Rechercher des interfaces, car ils sont la colonne vertébrale de la polymorphie dans OOP. S'étend fondamentalement implémente l'interface publique (et semi-publique, protégée) de la super classe automatiquement, comme vous en dérivez.


0 commentaires

2
votes

s'étend peut utiliser et / ou remplacer la méthode des parents.

Implements : Doit avoir toutes les méthodes d'interface: chaque méthode de l'interface doit être au moins déclarée dans la classe qui implémente.


0 commentaires