2016-08-09 97 views
3

wie ich Code war auf der Suche in Laravel 5 Projekt, traf ich mit einer Klasse wie unten -Was sind die Vorteile einer Schnittstelle ohne irgendwelche Methoden? In PHP

class Abc extends Command implements SelfHandling, ShouldBeQueued 
{ 

} 

Und wo Schnittstellen wie unten sind -

interface SelfHandling {} 
interface ShouldBeQueued {} 

Ich habe verwirrt, wenn es hat keine Methoden dann, was ist die Verwendung dieser Schnittstellen?

+1

Mögliches Duplikat von [Interface ohne Methoden] (http://stackoverflow.com/questions/20878039/interface-with-no-methods). Sie nennen sie "[Marker Interfaces] (https://en.wikipedia.org/wiki/Marker_interface_pattern)". – RandomSeed

Antwort

1

Es ermöglicht, Objekte durch Verhalten zu behandeln. Angenommen, Sie haben ein Array von Objekten unterschiedlicher Schnittstelle implementieren, können Sie sie dann unterscheiden dies zu tun:

if($obj instanceof ShouldBeQueued){ 
    //do something 
} 
else if{$obj instanceof SelfHandling){ 
    //do something else 
} 

Dieses Beispiel ein wenig roh, aber ich hoffe, dass es Ihnen helfen.

+0

Also was sollte der Fall sein, wenn ich eine Instanz von Abc-Klasse erstellen, kann es eine Instanz von ShouldBeQueued und SelfHandling gut sein? dann gibt es keine Bedeutung für wenn und sonst, wenn es in beiden Fällen fallen wird? – Abhishek

+0

Denken Sie daran, es ist nur ein grobes Beispiel. Sie können jedoch Objekte haben, die eines, beide oder keines dieser Interfaces implementieren und entsprechend verarbeiten. – vincenth

+0

Jemand hatte eine bessere Antwort als ich: http://wpkrauts.com/2013/how-to-build-flexible-php-interfaces/#interfaces-with-no-methods. In Ihrem Fall denke ich, dass es um interne Typen geht – vincenth

0

Sie werden als eine Art "Flagge" verwendet. Es kann überprüft werden, indem Sie $command instanceof ShouldBeQueued tun.

Die Alternative wäre, eine Methode einzuschließen, aber das würde mehrere Zeilen redundanten Codes erfordern. (Die meisten Implementierungen würden wieder true sowieso.)

interface ShouldBeQueued 
{ 
    /** 
    * @return bool 
    */ 
    function shouldBeQueued(); 
} 

class Abc extends Command implements ShouldBeQueued 
{ 
    function shouldBeQueued() 
    { 
     return true; 
    } 
} 

prüfen, es wäre auch ein wenig komplizierter sein:

if ($command instanceof ShouldBeQueued && $command->shouldBeQueued()) { /*...*/ } 

Ob es eine gute Praxis ist eine andere Sache.