Qué son las interfaces
Las interfaces son un sistema bastante común, utilizado en programación orientada a objetos. Son algo así como declaraciones de funcionalidades que tienen que cubrir las clases que implementan las interfaces.
En una interfaz se definen habitualmente un juego de funciones que deben codificar las clases que implementan dicha interfaz. De modo que, cuando una clase implementa una interfaz, podremos estar seguros que en su código están definidas las funciones que incluía esa interfaz.
Las interfaces nos permiten definir que métodos deben de ser declarados en una clase de forma similar a como lo hacíamos con las clases abstractas cuando no le dábamos cuerpo a los métodos. La principal diferencia es que no se hereda de una interfaz, se implementa, por lo que podemos heredar de una clase padre y a la vez implementar una interfaz o más.
A la hora de programar un sistema, podemos contar con objetos que son muy diferentes y que por tanto no pertenecen a la misma jerarquía de herencia, pero que deben realizar algunas acciones comunes. Por ejemplo, todos los objetos con los que comercian unos grandes almacenes deben contar con la funcionalidad de venderse. Una mesa tiene poco en común con un calefactor o unas zapatillas, pero todos los productos disponibles deben implementar una función para poder venderse.
Otro ejemplo. Una bombilla, un coche y un ordenador son clases muy distintas que no pertenecen al mismo sistema de herencia, pero todas pueden encenderse y apagarse. En este caso, podríamos construir una interfaz llamada “encendible”, que incluiría las funcionalidades de encender y apagar. En este caso, la interfaz contendría dos funciones o métodos, uno encender() y otro apagar().
Cuando se define una interfaz, se declaran una serie de métodos o funciones sin especificar ningún código fuente asociado. Luego, las clases que implementen esa interfaz serán las encargadas de proporcionar un código a los métodos que contiene esa interfaz. Esto es seguro: si una clase implementa una interfaz, debería declarar todos los métodos de la interfaz. Si no tenemos código fuente para alguno de esos métodos, por lo menos debemos declararlos como abstractos y, por tanto, la clase también tendrá que declararse como abstracta, porque tiene métodos abstractos.
Delaración de interfaces en PHP
La forma de declarar una interfaz es similar a como declaramos una clase, salvo que en vez de class se utiliza la instrucción interface seguido del nombre de esta:
1 2 3 4 5 6 7 8 9 10 11 |
<?php interface MiInterface { public function metodoUno( $parametro ); public function metodoDos( $parametro ); } ?> |
Uso de interfaces en PHP con Implements
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.
Hay que tener en cuenta que una interfaz no permite definir atributos a implementar en las clases, solo métodos, y estos deberán ser públicos siempre. Se podría decir que la razón de existir de una interfaz es mejorar la forma en que interactúan las clases entre si, conociendo que interfaz implementa una clase sabremos los métodos públicos que deberá tener.
1 2 3 4 5 6 7 |
<?php class MiClase implements MiInterface { } ?> |
Nota:
Antes de PHP 5.3.9, una clase no puede implementar dos interfaces que especifiquen un método con el mismo nombre, ya que podría causar ambigüedad. Las versiones más recientes de PHP permiten esto siempre y cuando los métodos duplicados tengan la misma firma.
Nota:
Las interfaces se pueden extender al igual que las clases utilizando el operador extends.
Nota:
La clase que implemente una interfaz debe utilizar exactamente las mismas estructuras de métodos que fueron definidos en la interfaz. De no cumplir con esta regla, se generará un error fatal.
Nota: en concreto, PHP 5 entiende que si una clase implementa una interfaz, los métodos de esa interfaz estarán siempre en la clase, aunque no se declaren. De modo que si no los declaramos explícitamente, PHP 5 lo hará por nosotros. Esos métodos de la interfaz serán abstractos, así que la clase tendrá que definirse como abstracta. |
Pero no debemos de olvidar declarar y asignarles un cuerpo a los métodos nombrados en la interfaz o nos devolverá un error tipo “Fatal error: Class MiClase contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MiInterface::metodoUno, MiInterface::metodoDos)”, lo correcto sería:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MiClase implements MiInterface { public function metodoUno( $parametro ){ //Cuerpo aquí } public function metodoDos( $parametro ){ //Cuerpo aquí } } |
Características principales de las interfaces
- Una interfaz solo definirá los métodos. De su lógica se encargarán las clases que implementen la interfaz. Y evidentemente, al igual que una clase abstracta, no se pueden instanciar. Instanciaremos las clases que implementan una interfaz.
- Todos los métodos declarados en una interfaz tienen que ser públicos.
- Los métodos de la clase que implementa una interfaz tienen que tener la misma visibilidad que en la interfaz o sea pública. Al contrario que con las clases abstractas que los métodos abstractos de las clases hijas podían tener la misma visibilidad o menos restrictiva.4. La clase que implemente una interfaz debe definir las mismas estructuras de métodos que fueron definidos en la interfaz. Pero además puede definir sus métodos propios y atributos.5. Mientras que en las clases abstractas se definir todo tipo de atributos (y su visibilidad), en las interfaces solo se pueden definir constantes. Y estas serán heredadas automáticamente por las clases que la implementen.
- Hay que tener cuidado cuando se define la interfaz y los nombres de sus métodos. Ya que un cambio en la interfaz ocasiona que haya que modificar todas las clases que implementen de esta. Habría que modificar el nombre de los métodos, ya que una interfaz obliga que todas las clases que implementen de ella tengan como mínimo los mismos métodos (además de tener que definir su lógica).
- Las interfaces también pueden ser heredadas por medio de la palabra extends.8. Mientras que una clase solo puede extender de una clase abstracta, una clase puede implementar más de una interfaz si se desea, separándolas cada una por una coma. Evidentemente dicha clase tendrá que implementar los métodos de cada una de las interfaces.
Diferencia entre interfaces en PHP y clases abstractas
Vamos a ver un resumen de las principales diferencias a nivel conceptual:
A) Métodos
- Clase abstracta debe de contener como mínimo un método abstracto (abstract), el cual solo se especifica el nombre y no se implementa. Los demás métodos pueden estar completamente implementados
- En una interfaz no es posible implementar métodos sino solo definir su nombre.
B) Modificadores de acceso / visibilidad
- En clase abstracta un método abstract se puede definir public, protected o private. Las subclases que heredan de la clase padre tienen que implementar estos métodos con la misma visibilidad o una con menor restricción
- En una interfaz todos los métodos son públicos.
C) Atributos
- En una clase abstracta, a parte de los métodos, se pueden definir atributos, con su visibilidad, y constantes.
- En una interfaz, aparte de los métodos, únicamente se puede definir constantes
D) Límites de uso
- Una clase puede heredar solo de una clase padre.
- Una clase puede implementar más de una interfaz.
E) Sobrescritura de métodos
- Usando clases abstractas, una clase hija puede sobrescribir o no un método definido en la clase padre. Evidentemente si el método es abstracto sí que está obligada a implementarlo y por lo tanto sobrescribirlo.
- Una clase que implementa una interfaz está obligada a sobrescribir todos los métodos. Ya que como se ha dicho, una interfaz solo los define pero no los implementa.
Nota: Si una clase abstracta únicamente tiene métodos abstractos quiere decir que se está usando con la funcionalidad de una interfaz.
Y a grandes rasgos se podría concluir diciendo que las clases abstractas se utilizan para compartir funciones. Mientras que las interfaces se utilizan para compartir como se tiene que hacer algo y que tiene que tener como mínimo.
Muy buena la nota! Muy clarificante. Gracias!
Solo tendrías que arreglar la lista que está en la sección “Características principales de las interfaces”, ya que hay varios puntos en el mismo, si te fijas en el 3 está el 4 y 5, y más abajo, en el 5, está el 8. No se si se entiende, pero si lo lees lo vas a ver.
Saludos!
Felix Santana Moya liked this on Facebook.
Fabián Vera liked this on Facebook.
Alejandro Vergara liked this on Facebook.
Rodrigo Solís liked this on Facebook.
Sandra Flores liked this on Facebook.