uso - son los tres grados de visibilidad de las variables y métodos en php
¿Es posible tener una interfaz que tenga métodos privados/protegidos? (5)
¿Es posible en PHP 5 tener una interfaz que tenga métodos privados / protegidos?
En este momento tengo:
interface iService
{
private method1();
}
Eso arroja un error:
Error de análisis: error de sintaxis, inesperado T_STRING, esperando T_VARIABLE
Solo quiero tener confirmación de que una interfaz solo puede contener métodos públicos.
En general, una interfaz solo puede tener miembros públicos, porque la única función de una interfaz debe heredarse.
Desde el tutorial de PHPfreaks.com:
PHP5 presenta interfaces. No debe confundirse con las interfaces en el sentido más general, la palabra clave de la interfaz crea una entidad que se puede usar para imponer una interfaz común sobre las clases sin tener que extenderlas como con las clases abstractas. En cambio, se implementa una interfaz.
Las interfaces son diferentes de las clases abstractas. Por un lado, no son en realidad clases. No definen propiedades, y no definen ningún comportamiento. Los métodos declarados en una interfaz deben declararse en las clases que lo implementan.
Debido a que una interfaz en el sentido más general es una definición de cómo un objeto interactúa con otro código, todos los métodos deben declararse públicos (consulte la sección sobre visibilidad en este capítulo). Al usar clases abstractas, un método abstracto puede tener cualquier visibilidad, pero las clases que se extienden deben tener sus implementaciones usando la misma (o más débil) visibilidad. La implementación de una interfaz agrega los métodos como métodos abstractos a la clase de sujeto, si no se implementa se producirá un error como el siguiente:
Error fatal: la Clase SomeConcreteClass contiene n métodos abstractos y, por lo tanto, debe declararse como abstracta o implementar los métodos restantes. Sí, las clases abstractas pueden implementar interfaces.
En muchos casos, una definición de interfaz ayuda a otros módulos a garantizar el comportamiento y la API de una clase. En esos casos, los métodos privados no son algo a lo que otros módulos puedan acceder o comprender. Es por eso que nunca puedes poner métodos privados en una interfaz.
La página del manual de PHP sobre interfaces explícitamente dice:
Todos los métodos declarados en una interfaz deben ser públicos; esta es la naturaleza de una interfaz.
Supongo que esto explica el error que estás recibiendo ;-)
Las interfaces se usan para describir los métodos públicos de una clase que implementa esa 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.
las interfaces son declaraciones de tipos. 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 que T::f
podría declararse privada. ¿Cómo sería eso útil para otros objetos? no sería llamable desde el exterior, no sería parte de su interfaz.