7
votes

Tapez l'allusion pour plusieurs interfaces non liées

Y a-t-il une manière dans PHP pour taper le conseil pour deux interfaces différentes et non liées? Par exemple: xxx

Comme vous pouvez le constater dans le code ci-dessus, la classe d'enregistreur s'attend à ce que son module ait la possibilité d'exécuter les deux error () et et ssh_for_recorder () , mais ceux-ci sont définis par différentes interfaces. Vous n'avez pas besoin d'être enregistrable et vice versa non plus.

Y a-t-il une meilleure pratique pour le faire? Je pensais à créer une interface qui s'étend à partir d'enregistrable et errontable et que le téléchargement __Module implémente cela, mais je ne sais pas quoi l'appeler.


3 commentaires

Qu'est-ce que cela a à voir avec le type d'allusion?


Voir le constructeur pour l'enregistreur. Je veux taper l'indice à la fois enregistrable et errontable.


Je pense que @Hammish est confus, tapez l'allusion à PHP nécessite une classe d'un certain type, où @TANDU nécessite de vérifier les types d'interfaces multiples.


4 Réponses :


10
votes

Non, ce n'est pas possible dans PHP.

Il existe d'autres langues (surtout fonctionnelles) qui supportent cette fonctionnalité appelée type union ( http: //fr.wikipedia. org / wiki / sum_type ).


3 commentaires

Comment suggéreriez-vous de contourner cela dans PHP?


Eh bien, faites une nouvelle interface qui s'étend à la fois enregistrable et errontable. Cependant, vous devrez modifier les classes qui implémentent les deux interfaces pour mettre en œuvre la nouvelle interface.


Comme je le pensais. J'ai fini par avoir enregistré d'être enregistré erronable de sorte que cela a également fonctionné dans ma demande.



6
votes

Le seul piratage de PHP est une fonction d'aide pour faire les chèques pour vous dans la méthode, comme: xxx pré>

, puis dans la méthode DO: P>

interface foobar extends foo,bar{}


3 commentaires

# 1 est intéressant mais je pense que ça va à la merveille. Je préfère n ° 2. Juste une note, cependant, les interfaces étendent d'autres interfaces, elles ne les mettent pas en œuvre. Votre code provoquera une erreur de syntaxe.


Bien que ce soit la seule solution raisonnable, je n'aime pas 2 parce que je dois également modifier la classe pour mettre en œuvre l'interface Union, au lieu des interfaces distinctes individuellement.


C'est # 2. C'est comme ça.



0
votes
public function __construct(recordable $recordable_module, errorable $errorable_module) {

  if($recordable_module == $errorable_module){
     $module = $recordable_module;
  }
  $this->module = $module;
  $this->ssh2 = $module->ssh_for_recorder();
}

0 commentaires

5
votes

J'ai décidé de répondre à cette question même si vous avez déjà accepté une réponse au motif que aucune des réponses données n'est vraiment acceptable. Bien que la réponse acceptée soit techniquement correcte, il y a un moyen de se déplacer. Quant aux autres réponses, leurs solutions de contournement sont inélégantes et non entièrement satisfaisantes.

PHP prend en charge une fonction assez obscure qui permet à une interface d'hériter d'une autre et d'une interface est capable d'hériter de plusieurs interfaces de base. p>

Par exemple, ce qui suit est parfaitement valide: p> xxx pré>

sémantiquement, si vous souhaitez qu'une méthode / fonction n'accepte qu'un argument qui implémente plusieurs interfaces alors Cela aurait tendance à suggérer que vous vous attendez à ce que les classes qui implémentent le même ensemble d'interfaces multiples soient en mesure de mettre en œuvre une interface couvrant les deux interfaces que vous souhaitez que votre argument soit conforme. p>

Dans votre cas si vous voulez quelque chose qui est à la fois erronable et un enregistreur, vous devez simplement ajouter l'interface suivante: p> xxx pré>

et Constructeur pour votre classe Recorder s'attendrait simplement à cette interface comme argument. P>

public function __construct(RecordableErrorable $module) { }


0 commentaires