Se vio anteriormente que las clases abstractas permiten generar funciones que no necesitan implementarse por la clase padre.
Las interfaces actúan de forma similar, pero difieren en que todos sus métodos no se implementan. Esto implica que una interface se encarga de definir el comportamiento de las clases que la implementen.
Problema
Se ha definido las siguientes clases: Pato, Pingüino, Cóndor y Gallina. Se ha establecido que existen atributos y métodos que comparten estas tres clases de aves y que se puede remitir dichas similitudes en una clase denominada Ave. Sin embargo, se puede observar que hay ciertas variaciones en el comportamiento de cada uno, por ejemplo:
- Pato: vuela y puede nada
- Pingüino: puede nadar
- Cóndor: puede volar
- Gallina: no vuela ni puede nadar.
Caso 1: Ave es clase no abstracta
Este caso implica que deben crearse e implementarse dos métodos: nadar() y volar(). La implementación en este punto es un tanto borrosa, debido a que esta superclase es muy general, se supone que de ella se derivarán todos los tipos de aves existentes.
Miremos, por ejemplo, la clase Cóndor hereda las dos funciones. Sin embargo, una de ellas no es parte de su naturaleza (nadar). Podría sobrescribir dicho método y retornar algún valor no valido. Al final es una construcción errónea.
Caso 2: Ave es clase abstracta
Este caso es similar al caso 1. La diferencia radica en que no se implementa las funciones, pero en cambio obligan a que lo haga las clases derivadas, obteniendo el mismo problema del caso 1.
Caso 3: Separar los comportamientos
El caso es que ambos comportamientos (nadar y volar) son independientes, por lo que la opción a observar es que se separen en estructuras independientes. Así el Pinguino usará heredará de la estructura que contenga la función nadar(), Cóndor de la que tenga la función volar() y Pato de ambas estructuras. Sabiendo que la herencia múltiple no es posible en PHP queda la única opción: Interfaces.
Bajo este esquema, es posible que las interfaces creadas puedan plantear el comportamiento no solo de tipos de aves, sino que de otras clases que deseen implementarlos.
Características
- Las interfaces de objetos permiten crear código con el cual especificar qué métodos deben ser implementados por una clase, sin tener que definir cómo estos métodos son manipulados.
- Las interfaces se definen de la misma manera que una clase, aunque reemplazando la palabra reservada
class
por la palabra reservadainterface
y sin que ninguno de sus métodos tenga su contenido definido. - Todos los métodos declarados en una interfaz deben ser públicos, ya que ésta es la naturaleza de una interfaz.
- Para implementar una interfaz, se utiliza el operador
implements
. - Todos los métodos en una interfaz deben ser implementados dentro de la clase; el no cumplir con esta regla resultará en un error fatal. Las clases pueden implementar más de una interfaz si se deseara, separándolas cada una por una coma.
Implementación de Interfaces
Es posible utilizar la herencia entre interfaces.
https://gist.github.com/jeavila/a9c44cdb3e1e846f65ba2a80c2d428be
Uso de constantes dentro de interfaces
Además de métodos públicos, es posible utilizar constantes dentro de una interface.
https://gist.github.com/jeavila/003f7ccf90f9e7f4aa9c425780e199f3
Algunas interfaces de PHP
El siguiente enlace: interfaces de PHP contiene algunas interfaces útiles para implementar.
Representación en UML
Las interfaces se representan con una circunferencia. La relación que existe ente una clase y una interface se llama Realización.