Puis-je étendre une classe à l'aide de plus de 1 classe en PHP?
Si j'ai plusieurs classes avec des fonctions que j'ai besoin mais souhaitez stocker séparément pour l'organisation, je peux étendre une classe à avoir les deux?
c'est à dire class a extends b extends c
edit: je sais comment étendre les classes une à une, mais je suis à la recherche d'une méthode pour instantanément d'étendre une classe à l'aide de plusieurs classes de base - autant que je sache, vous ne pouvez pas le faire en PHP, mais il devrait y avoir des moyens autour d'elle sans avoir recours à class c extends b
, class b extends a
- L'utilisation d'agrégation ou d'interfaces. L'héritage Multiple n'existe pas en PHP.
- Je suis à la recherche dans les interfaces que je ne suis pas un grand fan des grandes hiérarchies de classes. Mais je ne vois pas comment les interfaces de faire quoi que ce soit?
- Interfaces vous permettent de "héritent" de l'API uniquement, pas de corps de fonction. C'forces de catégorie a à mettre en œuvre des méthodes de l'interface b et c. Cela signifie que si vous voulez hériter problème, vous devez d'agrégation des objets membres des classes b et c dans votre classe un.
- Je veux dire mettre private $b (instance de b) et private $c (instance de c) dans votre classe un, si ce n'était pas assez claire.
- Pensez à utiliser les Décorateurs sourcemaking.com/design_patterns/decorator ou des Stratégies de sourcemaking.com/design_patterns/strategy
- J'avais ma question si je pense que l'héritage multiple, la meilleure solution à mon problème. J'ai couru en bas de cette route et suis tombé sur cette question. En règle générale, si vous essayez de faire quelque chose qui n'est pas naturellement pris en charge par la langue, vous devriez vous interroger sur votre conception. L'héritage Multiple semble trop confus et maladroit.
- Veuillez considérer les traits comme la réponse correcte.
Vous devez vous connecter pour publier un commentaire.
Répondre à vos edit :
Si vous voulez vraiment faux héritage multiple, vous pouvez utiliser la fonction magique __call().
C'est laid mais il fonctionne à partir de la classe de l'utilisateur du point de vue :
Imprime "abcdef"
Vous ne pouvez pas avoir une classe qui étend la classe deux classes de base. Vous ne pourriez pas avoir.
Vous pouvez, toutefois, ont une hiérarchie comme suit...
et ainsi de suite.
Vous pouvez utiliser des traits, qui, nous l'espérons, sera disponible à partir de PHP 5.4.
Traits est un mécanisme de réutilisation de code dans l'héritage simple des langages tels que PHP. Un Trait est destiné à réduire certaines limites de l'héritage simple, en permettant à un développeur de réutilisation des ensembles de méthodes librement dans plusieurs classes indépendantes de vie dans les différentes hiérarchies de classes. La sémantique de la combinaison des Traits et des classes est définie d'une manière qui réduit la complexité et évite les problèmes typiques associés avec l'héritage multiple et Mixin.
Ils sont reconnus pour leur potentiel de soutien à l'amélioration de la composition et de la réutilisation, par conséquent, leur intégration dans les nouvelles versions de langages tels que Perl 6, Squeak, Scala, de l'Ardoise et de la Forteresse. Les Traits ont également été portés à Java et en C#.
Plus d'informations: https://wiki.php.net/rfc/traits
Classes ne sont pas destinés à être juste collections de méthodes. Une classe est censée représenter un concept abstrait, à la fois de l'etat (champs) et le comportement (méthodes), ce qui modifie l'état. L'utilisation de l'héritage juste pour obtenir certains comportements désirés sonne comme une mauvaise OO design, et c'est exactement la raison pour laquelle beaucoup de langues refuser l'héritage multiple: afin d'éviter les "spaghetti à la succession", c'est à dire l'extension de 3 classes, car chacun a une méthode dont vous avez besoin, et de se retrouver avec une classe qui hérite de 100 méthode et 20 champs, mais seulement jamais utilise 5 d'entre eux.
Il y a des plans pour l'ajout de condiments, bientôt, je crois.
Mais jusqu'alors, allez-y avec la accepté de répondre. Vous pouvez abstrait qu'un peu de faire un "extensible" classe:
Noter que dans ce modèle "OtherClass" arrive à "connaître" environ $foo. OtherClass doit avoir une fonction publique appelée "setExtendee" pour établir cette relation. Puis, si c'est les méthodes sont appelées à partir d' $foo, il peut accéder à $foo en interne. Il ne sera pas, cependant, obtenir l'accès à tout privé/protégé méthodes/variables comme un véritable étendue de la classe.
Actuellement accepté de répondre par @Franck va fonctionner, mais il n'est pas, en fait, l'héritage multiple, mais un enfant instance de la classe définie hors de portée, il y a aussi le
__call()
sténo - envisager d'utiliser juste$this->childInstance->method(args)
où vous en avez besoin ExternalClass méthode de classe dans "étendue" de la classe.Réponse exacte
Non vous ne pouvez pas, respectivement, pas vraiment, comme manuel de
extends
mot clé dit:Vraie réponse
Cependant que @adam suggéré correctement, cela ne vous interdit d'utiliser plusieurs hiérarchique de l'héritage.
Vous POUVEZ étendre une classe, avec un autre et un autre avec une autre, et ainsi de suite...
Donc assez simple exemple sur ce serait:
Remarque importante
Comme vous l'avez peut-être remarqué, vous ne pouvez le faire de plusieurs(2+) intehritance par la hiérarchie, si vous avez le contrôle sur toutes les classes incluses dans le processus de - ce qui signifie, vous ne pouvez pas appliquer cette solution, par exemple, avec les classes intégrées ou avec les classes que vous simplement ne pouvez pas modifier - si vous voulez le faire, vous êtes de gauche avec la @Franck solution - les instances enfant.
...Et finalement, exemple avec certaines de sortie:
Les sorties qui
Utilisation des traits que les classes de base. Ensuite les utiliser dans une classe parente. L'étendre .
Voir maintenant femme d'affaires logiquement hérité d'affaires et homme à la fois;
BusinessWoman
au lieu deBusinessPerson
? Ensuite, vous pouvez faire un vrai multi-héritage.J'ai lu plusieurs articles en décourageant l'héritage dans les projets (par opposition à des bibliothèques/cadres), et la promotion du programme agaisnt interfaces, pas contre des mises en œuvre.
Ils préconisent également OO par la composition: si vous avez besoin des fonctions de catégorie a et de b, c avoir des membres/des champs de ce type:
L'héritage Multiple semble fonctionner au niveau de l'interface.
J'ai fait un test sur php 5.6.1.
Voici un code qui fonctionne:
Je ne pensais pas que c'était possible, mais je suis tombé sur le SwiftMailer code source, dans le Swift_Transport_IoBuffer classe, ce qui est la définition suivante:
Je n'ai pas jouer avec elle encore, mais j'ai pensé qu'il pourrait être intéressant de partager.
Je viens de résoudre mon "héritage multiple" problème avec:
De cette façon, j'ai le pouvoir de manipuler session à l'intérieur d'un SessionResponse qui s'étend MyServiceResponsetype toujours être en mesure de gérer la Session par lui-même.
Vous êtes en mesure de le faire à l'aide de Traits en PHP qui a annoncé que de PHP 5.4
Voici un rapide tutoriel pour vous, http://culttt.com/2014/06/25/php-traits/
PHP ne supporte pas encore l'héritage de classe multiple, il ne prend cependant en charge plusieurs héritage de l'interface.
Voir http://www.hudzilla.org/php/6_17_0.php pour quelques exemples.
PHP ne permet pas l'héritage multiple, mais vous pouvez le faire avec la mise en œuvre de plusieurs interfaces. Si la mise en œuvre est "lourd", de fournir squelettique de la mise en œuvre pour chaque interface dans une salle de classe. Ensuite, vous pouvez déléguer l'ensemble de l'interface de la classe de ces squelettique implémentations via objet de confinement.
Ne sachant pas exactement ce que vous essayez d'atteindre, je suggère de regarder dans la possibilité de la refonte de l'application pour utiliser la composition plutôt que de l'héritage dans ce cas.
Toujours une bonne idée est de faire de la classe parent, avec des fonctions ... c'est à dire ajouter ce que toutes les fonctionnalités d'un parent.
Et "déplacer" toutes les classes qui utilisent cette hiérarchiquement vers le bas. J'ai besoin de réécrire les fonctions, qui sont spécifiques.
Si vous voulez vérifier si une fonction est publique, voir ce sujet : https://stackoverflow.com/a/4160928/2226755
Et l'utilisation call_user_func_array(...) la méthode pour de nombreux ou pas d'arguments.
Comme ceci :
L'un des problèmes de PHP comme langage de programmation est le fait que vous ne pouvez avoir de l'héritage simple. Cela signifie qu'une classe ne peut hériter d'une autre classe.
Cependant, beaucoup de temps, il serait bénéfique d'hériter de plusieurs classes. Par exemple, il pourrait être souhaitable d'hériter des méthodes à partir d'un couple de différentes classes afin d'éviter la duplication de code.
Ce problème peut conduire à la classe qui a une longue histoire de la famille de l'héritage qui, souvent, ne fait pas de sens.
En PHP 5.4 une nouvelle fonctionnalité de la langue a été ajoutée connus comme des Traits. Un Trait est un peu comme un Mixin en ce qu'il permet de mélanger Trait de classes dans une classe existante. Cela signifie que vous pouvez réduire la duplication de code et obtenir les avantages tout en évitant les problèmes de l'héritage multiple.
Traits
class A extends B {}
class B extends C {}
Puis Un a étendu à la fois B et C
B
. Ce que nous voulons, la plupart du temps, c'est d'avoir deux classes indépendantesB
etC
(probablement à partir de différentes bibliothèques) et d'obtenir simultanément héritée parA
, tels queA
contient tout ce à partir de deuxB
etC
, maisB
ne contient rien deC
et vice versa.