2012-10-15 13 views
17

Ich benutze eine Schnittstelle für eine Reihe von Klassen. Ich habe jedoch ein Problem, weil ich möchte, dass visibility in der Schnittstelle erlaubt ist (das heißt: public, protected und private).PHP-Schnittstelle: Any Sichtbarkeit geben

Ich brauche die Mutter Methode nur, und ich muss sein privates das Kind Verfahren geschützt werden, aber ich habe den Fehler sagen

Fatal error: Access type for interface method Baz::qux() must be omitted in <the file with Baz/Bar>."

Ich habe versucht, in der inteface andere Sicht Methoden spezifiziert Baz und Entfernen public, aber sie alle versagten.

Gibt es einen Weg, ich kann es über die Schnittstelle tun? Wenn nicht, dann gibt es einen Weg, ich kann es abstract deklarieren, ich habe das auch versucht, aber gescheitert.

interface Baz 
{ 
    public function qux(); 
} 

class Bar implements Baz 
{ 
    protected function qux() 
    { 
     //do foo 
    } 
} 

class Foo extends Bar implements Baz 
{ 
    private function qux() 
    { 
     parent::qux(); 
    } 
} 
+3

Wann immer Sie so etwas zu brauchen scheinen, ist dies normalerweise ein starkes Anzeichen dafür, dass etwas mit Ihrem Konzept nicht stimmt. – Niko

+0

Entschuldigung, jetzt weiß ich das. Danke für die Info alle. – PolishHurricane

+0

Eine Schnittstelle ist nur ein Drahtgitter, also warum interessieren Sie sich für Sichtbarkeit darin –

Antwort

38

Methoden, die Sie in Interfaces deklarieren, sollten öffentlich sein. Sie definieren einen Vertrag mit einer Schnittstelle. Alle nicht-öffentlichen Methoden wären Implementierungsdetails, und diese gehören nicht zu einer Schnittstelle.

Aus Wikipedia:

Programming to the interface

The use of interfaces allows a programming style called programming to the interface. The idea behind this is to base programming logic on the interfaces of the objects used rather than on internal implementation details. Programming to the interface reduces dependency on implementation specifics and makes code more reusable.[7] It gives the programmer the ability to later change the behavior of the system by simply swapping the object used with another implementing the same interface.

+0

Ich habe eine '__call()' Methode, die die geschützte Methode mit demselben Namen der Eigenschaft mit Präfix aufruft. Der Zugriff auf '$ object-> name' ruft protected' $ object-> getName() 'auf. In diesem Fall könnte die Schnittstelle der privaten oder geschützten Methode einen Sinn haben? Ich bin mir nicht sicher. –

+1

@IvanMontilla eine Schnittstelle für diese Verwendung wäre nicht sinnvoll, da die Schnittstelle auf die externe Verwendung von jeder Klasse, die es implementiert, ausgerichtet ist. Wenn Sie konsistentes, geerbtes Verhalten in Form von geschützten Methoden erzwingen wollen, können Sie eine abstrakte Klasse mit einer abstrakten Methode verwenden, die alle Klassen, die diese abstrakte Klasse erweitern, dazu zwingt, diese Methode zu implementieren (solange diese Klassen selbst nicht abstrakt sind). (Das meint auch JvdBerg mit seiner [antworten] (http://stackoverflow.com/a/12898500/1645553) auf diese Frage.) – jaffog

13

Eine Schnittstelle ist ein Vertrag zwischen zwei Parteien, eine Vereinbarung, wie sie kommunizieren.

Es macht keinen Sinn, Methoden geschützt oder privat zu machen, weil die andere Partei diese nicht sehen wird.

0

Die Entwickler deaktivierten die Sichtbarkeit für mehr flüssige Wiederverwendung. Über das Schlüsselwort implements binden Sie bereits eine Schnittstelle an eine Klasse. Sie können auf eine Schnittstelle nicht zugreifen, ohne dass sie trotzdem implementiert wurde.