Vienen a ser el siguiente paso en la encapsulación de objetos. Primero teníamos las clases que representan objetos únicos, con los cuales podemos construir otros a partir de ellos utilizando la palabra ‘extends’. Luego podíamos declarar clases abstractas que tenían métodos abstractos que no se implementaban (programaban) en la clase padre, sino que se obligaba a que se implementaran en las clases hijas. Las clases hijas extendían de la clase abstracta padre de igual manera que antes.
Ahora tenemos las interfaces, que vienen a ser clases que simplemente nos dicen los métodos que hay que implementar en las clases hijas. Unas interfaces se pueden extender en otras, con lo que heredan las declaraciones de los métodos utilizando la palabra clave extends, pero siguen sin implementar los métodos porque siguen siendo interfaces. Pero cuando llegamos a una clase hija que va a implementar dichos métodos utilizaremos la palabra clave implements. Con un ejemplo se verá claro y rápido.
El ejemplo
<?php error_reporting(E_ALL); ini_set('display_errors', '1'); // interfaz que obliga a implementar dos funciones interface iVehiculo { public function escribirMatricula(); public function coordenadas(); } // clase que implementa la interfaz anterior class vehiculo implements iVehiculo { public $x=0; public $y=0; public $matricula; public function coordenadas(){ return '(' . $this->x . ', ' . $this->y . ')'; } public function escribirMatricula() { return $this->matricula; } } // moto de tipo vehiculo que hereada las variables y funciones anteriores class moto extends vehiculo { public $velocidadMaxima; // funcion que devuelve los datos para escribirlos en la respuesta public function __toString(){ $cadena = 'Esto es una moto con matrícula ' . $this->escribirMatricula() . ', con velocidad máxima ' . $this->velocidadMaxima . ' y coordenadas ' . $this->coordenadas() . '. <br>'; return $cadena; } } // coche que hereda de vehiculo de igual manera que moto class coche extends vehiculo { public $tipo; // igual que en moto, funcion que devuelve los datos para escribirlos en la respuesta public function __toString(){ $cadena = 'Esto es un coche con matrícula ' . $this->escribirMatricula() . ', de tipo ' . $this->tipo . ' y coordenadas ' . $this->coordenadas() . '. <br>'; return $cadena; } } $micoche = new coche(); $mimoto = new moto(); // tanto la moto como el coche tienen matrícula // porque heredan la variable matrícula $micoche->matricula = "ABC123"; // sólo es coche tiene tipo $micoche->tipo = "utilitario"; $mimoto->matricula = "DEF123"; // sólo la moto tiene velocidad máxima $mimoto->velocidadMaxima = 300; echo '<html lang="es"><head><meta charset="utf-8"></head><body>'; echo $micoche; echo $mimoto; echo '</body></html>';
Si ejecutamos el script anterior debemos ver lo siguiente:
Esto es un coche con matrícula ABC123, de tipo utilitario y coordenadas (0, 0). Esto es una moto con matrícula DEF123, con velocidad máxima 300 y coordenadas (0, 0).
Resumiendo, las interfaces son una forma sencilla de obligar a programar de cierta manera las clases que implementan dicha interfaz. Un dato importante es que una clase puede extender sólo de otra, mientras que puede implementar varias interfaces. A fecha en que escribo no tenemos herencia múltiple en PHP, técnicamente las interfaces no nos dan herencia entre objetos, simplemente nos orientan sobre los métodos o funciones que debemos programar en las clases.
Documentación oficial: http://php.net/manual/es/language.oop5.interfaces.php