2016-04-16 8 views
0

ein Objekt Gegeben:Array von Objekten: Wie Schnittstelle, um sicherzustellen,

class MyObject implements MyInterface 
{ 
    public function testMethod() { 

    } 
} 

Wenn es eine weitere Klasse sein, was ein Array von Objekten verwendet, die implment wie diese MyInterface:

class Consumer 
{ 
    public function __construct(array $myInterfaces) 
    { 
     foreach($myInterfaces as $myI) { 
      $myI->testMethod(); 
     } 
    } 

} 

Wie kann ich Mach mein Programmdesign robust, wo ich weiß, dass ich testMethod() gegen die Array-Elemente sicher aufrufen kann?

+1

Err, ist das Java oder PHP? – Tunaki

+0

Ich denke, Sprache Agnostiker. Ich habe Java-Tag als Java aus meiner Meinung ist sehr stark auf OOP und Design-Muster. Aber ich musste das Beispiel in einer Sprache schreiben –

+0

Ich verstehe die Frage nicht. Warum gibt es ein PHP- und Java-Snippet? Wolltest du genau das tun? Versuchen Sie irgendwie, zwischen Java und PHP zu kommunizieren? – Tunaki

Antwort

1

Sie können den Operator instanceof verwenden. Zum Beispiel:

foreach ($objects as $object) { 
    if ($object instanceof Interface) { 
     $object->testMethod(); 
    } else { 
     throw new InvalidArgumentException('All objects must implement Interface.'); 
    } 
} 

In einigen Sprachen gibt es Arrays eingegeben, die diese durchsetzen können wie oben ist ein Beispiel für PHP, die typisierte Arrays nicht (wie Java.).

0

In PHP verwenden Sie die class_implements('MyObject') und durchlaufen das resultierende Array.

0

Sie können die Verwendung von Typ-Hinting (Typ Referenzen) wie so machen:

class Consumer { 

    public function __construct(array $myInterfaces) { 
     foreach ($myInterfaces as $myI) { 
      $this->process($myI); 
     } 
    } 

    private function process(MyInterface $m) { 
     $m->testMethod(); 
    } 

} 

So einen fatalen Fehler zu vermeiden, Verfahren() eine Instanz von MyInterface und durch Erweiterung Konstruktorargument bekommen müssen muss eine Sammlung von MyInterfaces sein.

Sie haben effektiv den Constrained-Typ eingeschränkt, den der Auflistungskonstruktor empfängt.

+0

php7 würde tatsächlich veranlassen, dass process() eine TypeError-Exception auslöst, falls ein falscher Typ übergeben wird, der Ihrem Konstruktor eine Chance gibt, eine Exception mit einer entsprechenden Fehlermeldung zu werfen, die beschreibt, was mit der Sammlung falsch ist. – Weltschmerz