2009-12-09 5 views
52

Ist es in PHP 5 möglich, eine Schnittstelle mit privaten/geschützten Methoden zu haben?Ist es möglich, eine Schnittstelle mit privaten/geschützten Methoden zu haben?

Im Moment habe ich:

interface iService 
{ 
    private method1(); 
} 

, die einen Fehler wirft:

Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE

Ich möchte nur eine Bestätigung haben, dass dies der Fall ist, die eine Schnittstelle nur öffentliche Methoden enthalten.

+2

Ich finde die Antwort enttäuschend. Ich möchte Schnittstellen, die auch geschützte/private Methoden unterstützen. Zum Beispiel habe ich eine Klasse, bei der eine öffentliche Methode, die im Abstract implementiert wird, auf einer geschützten Methode beruht, die von einer Unterklasse implementiert wird. Ich möchte eine Schnittstelle verwenden, um die von den abstrakten public-Methoden benötigten geschützten Methoden durch Unterklassen zu implementieren. – Stoutie

+3

Verwenden Sie eine abstrakte Basisklasse für diesen Zweck. Sie können die beiden Ansätze kombinieren: Öffentliche Methoden in der Schnittstelle, Implementierung dieser Methoden in einer abstrakten Basisklasse, die abstrakte geschützte Methoden definiert (und auf sie zurückgreift). –

+2

Wenn Sie private oder geschützte Methoden deklarieren könnten, wäre das 'private function method1();' not 'private method1();'. – turibe

Antwort

88

Die PHP manual page about interfaces erklärt sich ausdrücklich:

All methods declared in an interface must be public, this is the nature of an interface.

Ich denke, das den Fehler erklärt, Sie werden immer

8

Im Allgemeinen kann eine Schnittstelle nur öffentliche Member haben, weil die einzige Funktion einer Schnittstelle vererbt werden soll.

Von PHPfreaks.com Tutorial:

PHP5 features interfaces. Not to be confused with interfaces in the more general sense, the interface keyword creates an entity that can be used to enforce a common interface upon classes without having to extend them like with abstract classes. Instead an interface is implemented.

Interfaces are different from abstract classes. For one, they’re not actually classes. They don’t define properties, and they don’t define any behaviour. The methods declared in an interface must be declared in classes that implement it.

Because an interface in the more general sense is a definition of how an object interacts with other code, all methods must be declared public (see section on visibility in this chapter). Using abstract classes, an abstract method can have any visibility, but the extending classes must have their implementations use the same (or weaker) visibility. Implementing an interface adds the methods as abstract methods to the subject class, failure to implement it will result in an error like the following:

Fatal error: Class SomeConcreteClass contains n abstract method(s) and must therefore be declared abstract or implement the remaining methodsYes, abstract classes can implement interfaces.

+2

Es ist schade. Weil ich eine öffentliche Methode, die von der Schnittstelle benötigt wird, in einer abstrakten Klasse implementieren möchte, die auf einer geschützten Methode beruht, die auch von der Schnittstelle durchgesetzt wird. Auf diese Weise kann die abstrakte Klasse die öffentliche Schnittstelle bereitstellen, aber es ist Aufgabe der Unterklassen, die zugrunde liegende Logik zu implementieren. Sinn ergeben? – Stoutie

+3

Scheint so, als ob die Methode von der Unterklasse als abstrakt implementiert werden soll. Dann muss jede Unterklasse es implementieren. Aber es hat nichts mit der Schnittstelle zu tun. – Sven

20

Schnittstellen verwendet werden, die eine Schnittstelle öffentliche Methoden einer Klasse zu beschreiben, zu implementieren. Sie können niemals eine private Methode in einer Schnittstelle haben. Es wird davon ausgegangen, dass alle Methoden in einer Schnittstelle verwendet werden und nicht geändert werden sollten.

Interfaces ist der PHP-Link, aber das ist Standard in der OO-Programmierung.

+0

in anderen Sprachen wie Java, könnten Sie Zugriffsmodifizierer in Schnittstellen verwenden. – BRjava

6

Schnittstellen Typ Erklärungen ;-) sind. Ein Typ ist eine Menge von Werten plus eine Reihe von Operationen, die von außen auf sie angewendet werden können. Eine private Methode passt nicht in dieses Bild.

Schnittstellen sind nützlich, weil sie, gut, Objekte 'Schnittstellen angeben. wie die Objekte mit ihrer Umgebung kommunizieren.

jetzt sagen wir T::f könnte privat erklärt werden. Wie wäre das für andere Objekte nützlich? es wäre von außen nicht aufrufbar, es wäre nicht Teil seiner Schnittstelle.

3

In vielen Fällen hilft eine Schnittstellendefinition anderen Modulen, das Verhalten und die API einer Klasse zu garantieren, in diesem Fall ist es etwas Privates, auf das die anderen Module nicht zugreifen oder es nur verstehen können. Deshalb können Sie niemals private Methoden auf eine Schnittstelle setzen.

Verwandte Themen