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.

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:

<?php 
interface MiInterface { 
    public function metodoUno( $parametro ); 
    public function metodoDos( $parametro ); 
} 
?>

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.

Para implementar una interfaz debemos de añadir en la declaración de la clase la instrucción implements seguido del nombre de nuestra interfaz:

<?php 
class MiClase implements MiInterface { } 
?>

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:

class MiClase implements MiInterface { 
    public function metodoUno( $parametro ){ 
        //Cuerpo aquí 
    } 
    public function metodoDos( $parametro ){ 
        //Cuerpo aquí 
    } 
}

Como ejemplo de uso de las interfaces imaginemos una moto y un balón de fútbol, aparentemente no tienen nada en común por lo que la idea de heredar de una misma clase no tiene demasiado sentido, pero ambos son objetos que en algún momento se romperán, se puede crear una interfaz que declare el método romper() y implementarlo en las clases de ambos objetos, de esta forma nos aseguramos de que los dos aunque hereden de padres diferentes contienen el método romper().