167 votes

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 à l' class c extends b, class b extends a

179voto

Franck Points 4066

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 :

class B {
    public function method_from_b($s) {
    	echo $s;
    }
}

class C {
    public function method_from_c($s) {
    	echo $s;
    }
}

class A extends B
{
  private $c;

  public function __construct()
  {
    $this->c = new C;
  }

  // fake "extends C" using magic function
  public function __call($method, $args)
  {
    $this->c->$method($args[0]);
  }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("def");

Imprime "abcdef"

142voto

adam Points 10572

Vous ne pouvez pas avoir une classe qui étend la classe deux classes de base. Vous ne pourriez pas avoir.

// this is NOT allowed (for all you google speeders)
Matron extends Nurse, HumanEntity

Vous pouvez, toutefois, ont une hiérarchie comme suit...

Matron extends Nurse    
Consultant extends Doctor

Nurse extends HumanEntity
Doctor extends HumanEntity

HumanEntity extends DatabaseTable
DatabaseTable extends AbstractTable

et ainsi de suite.

64voto

Nikola Petkanski Points 1197

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

18voto

Sam Points 1217

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" de la classe:

class Extendable{
  private $extender=array();

  public function addExtender(Extender $obj){
    $this->extenders[] = $obj;
    $obj->setExtendee($this);
  }

  public function __call($name, $params){
    foreach($this->extenders as $extender){
       //do reflection to see if extender has this method with this argument count
       if (method_exists($extender, $name)){
          return call_user_func_array(array($extender, $name), $params);
       }
    }
  }
}


$foo = new Extendable();
$foo->addExtender(new OtherClass());
$foo->other_class_method();

A noter que dans ce modèle de "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.

18voto

Michael Borgwardt Points 181658

Les 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.

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