2009-12-09 24 views
52

¿Es posible en PHP 5 tener una interfaz que tenga métodos privados/protegidos?¿Es posible tener una interfaz que tenga métodos privados/protegidos?

Ahora mismo tengo:

interface iService 
{ 
    private method1(); 
} 

Eso genera un error:

Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE

Yo sólo quiero tener confirmación de que es el caso de que una interfaz sólo puede contener métodos públicos.

+2

Encuentro la respuesta decepcionante. Me gustaría interfaces que admitan también métodos protegidos/privados. Por ejemplo, tengo una clase, donde un método público, implementado en abstracto, se basa en un método protegido implementado por subclase. Quiero usar una interfaz para requerir subclases para implementar los métodos protegidos requeridos por los métodos públicos abstractos. – Stoutie

+3

Usa una clase base abstracta para ese propósito. Puede combinar los dos enfoques: métodos públicos en la interfaz, implementación de esos métodos en una clase base abstracta que define (y se basa) en métodos abstractos protegidos. –

+2

Si pudiera declarar métodos privados o protegidos, sería 'private function method1();' not 'private method1();'. – turibe

Respuesta

88

El PHP manual page about interfaces afirma explícitamente:

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

supongo que esto explica el error que está recibiendo ;-)

8

En general, una interfaz solo puede tener miembros públicos, ya que la única función de una interfaz es heredar.

De 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 una pena. Porque me gustaría tener un método público, requerido por la interfaz, implementado en una clase abstracta, que se base en un método protegido también implementado por la interfaz. De esta manera, la clase abstracta puede proporcionar la interfaz pública, pero depende de las subclases implementar la lógica subyacente. ¿Tener sentido? – Stoutie

+3

Parece que desea que el método para ser implementado por la subclase sea abstracto. Entonces cualquier subclase DEBE implementarlo. Pero no tiene nada que ver con la interfaz. – Sven

20

interfaces se utilizan para describir los métodos públicos de una clase que implementa la interfaz. Nunca puedes tener un método privado en una interfaz. Se supone que todos los métodos en una interfaz están en uso y no deben modificarse.

Interfaces es el enlace PHP, pero esto es estándar en la programación OO.

+0

en otros idiomas como java, podría usar modificadores de acceso en las interfaces. – BRjava

6

interfaces son declaraciones de tipo. un tipo es un conjunto de valores, más un conjunto de operaciones que pueden realizarse desde el exterior. un método privado no encaja en esta imagen.

interface T { 
    public /*int*/ function f(array $a); 
} 
interface U { 
    public /*T*/ function g(T $t); 
} 

class C implements U { 
    public function g(T $t) { 
     ... 
     $x = $t->f(); 
     ... 
    } 
} 

Las interfaces son útiles porque indican, bueno, las interfaces de los objetos. cómo los objetos se comunican con su entorno.

ahora digamos T::f podría ser declarado privado. ¿Cómo sería eso útil para otros objetos? no sería llamable desde el exterior, no sería parte de su interfaz.

3

En muchos casos, una definición de interfaz ayuda a otros módulos a garantizar el comportamiento y la API de una clase, en ese caso, algo privado no es que los demás módulos puedan acceder o simplemente entenderlo. Por eso nunca puedes poner métodos privados en una interfaz.

Cuestiones relacionadas