Interfaces en POO en PHP
Como ya sabes, las clases abstractas representan un conjunto de métodos para sus descendientes. Una parte de estos métodos puede implementarse en la propia clase, y otra parte de los métodos puede declararse abstracta y requerir implementación en las clases hijas.
Imaginemos una situación en la que tu clase abstracta representa solo un conjunto de métodos públicos abstractos, sin agregar métodos con implementación.
En realidad, tu clase padre describe la interfaz de los descendientes, es decir, el conjunto de sus métodos públicos, obligatorios para su implementación.
Para qué necesitamos esto: para cometer menos errores al programar - al describir todos los métodos necesarios en la clase padre, podemos estar seguros de que todos los descendientes los implementarán realmente.
Cuándo ayuda esto: supongamos que creamos nuestra clase padre y varias clases hijas. Si después de un tiempo, por ejemplo, un mes después, decidimos crear otra clase hija, seguramente ya habremos olvidado los detalles de nuestro código y podríamos olvidarnos de escribir la implementación de algún método en la nueva clase hija. Sin embargo, el propio PHP no permitirá que se pierda el método - y simplemente mostrará un error.
Lo mismo se aplica a otro programador que trabaje en tu proyecto. Supongamos que el código de la clase padre lo escribiste tú, y luego tu colega decide crear otra clase hija. Tu colega tampoco podrá olvidar un par de métodos.
Sin embargo, hay un problema: en realidad hicimos nuestra clase padre para escribir en ella métodos públicos abstractos, pero nosotros mismos o nuestro colega tenemos la posibilidad de accidentalmente agregar a esta clase un método no público o no abstracto.
Supongamos que queremos prohibir físicamente hacer en la clase padre métodos distintos a los métodos públicos abstractos. En PHP, para esto, en lugar de clases abstractas, se pueden usar interfaces.
Las interfaces representan clases en las que todos los métodos son públicos y no tienen implementación. El código de los métodos debe ser implementado por las clases que heredan (implementan) las interfaces.
Las interfaces se declaran de la misma manera que las clases
ordinarias, pero usando la palabra clave interface
en lugar de la palabra class.
Para la herencia de interfaces se usa
una terminología ligeramente diferente: se dice que
las clases no heredan de interfaces, sino que las implementan.
En consecuencia, en lugar de la palabra extends
se debe usar la palabra clave
implements.
No se puede crear un objeto de una interfaz. Todos los métodos
de la interfaz deben declararse como public
y no deben tener implementación. Una interfaz
puede tener solo métodos, no propiedades.
Tampoco se puede crear una interfaz y una clase con
el mismo nombre.