Saltar la navegación

1.6.1.- Interfaces (I).

Dibujo de un diagrama UML representando dos interfaces: Persona y Usuario y una clase Empleado que implementa ambas.
Captura de pantalla BlueJ (Elaboración propia.)

Una de las dudas más comunes en POO, es qué solución adoptar en algunas situaciones: interfaces o clases abstractas. Ambas permiten definir reglas para las clases que los implementen o hereden respectivamente. Y ninguna permite instanciar objetos. Las diferencias principales entre ambas opciones son:

  • En las clases abstractas, los métodos pueden contener código. Si van a existir varias subclases con un comportamiento común, se podría programar en los métodos de la clase abstracta. Si se opta por un interface, habría que repetir el código en todas las clases que lo implemente.
  • Las clases abstractas pueden contener atributos, y los interfaces no.
  • No se puede crear una clase que herede de dos clases abstractas, pero sí se puede crear una clase que implemente varios interfaces.

Por ejemplo, en la tienda online va a haber dos tipos de usuarios: clientes y empleados. Si necesitas crear en tu aplicación objetos de tipo Usuario (por ejemplo, para manejar de forma conjunta a los clientes y a los empleados), tendrías que crear una clase no abstracta con ese nombre, de la que heredarían Cliente y Empleado.

class Usuario {
    . . .
}
class Cliente extends Usuario {
    . . .
}
class Empleado extends Usuario {
    . . .    
}

Pero si no fuera así, tendrías que decidir si crearías o no Usuario, y si lo harías como una clase abstracta o como un interface.

Si por ejemplo, quisieras definir en un único sitio los atributos comunes a Cliente y a Empleado, deberías crear una clase abstracta Usuario de la que hereden.

abstract class Usuario {
    public $dni;
    protected $nombre;
    . . .
}

Pero esto no podrías hacerlo si ya tienes planificada alguna relación de herencia para una de estas dos clases.

Para finalizar con los interfaces, a la lista de funciones de PHP relacionadas con la POO puedes añadir las siguientes.

Funciones de utilidad para interfaces en PHP
Función Ejemplo Significado
get_declared_interfaces()
print_r(get_declared_interfaces());
Devuelve un array con los nombres de los interfaces declarados.
interface_exists() if(interface_exists('iMuestra') Devuelve true si existe el interface que se indica, o false en caso contrario.

Autoevaluación

Pregunta

Si en tu código utilizas un interface, y quieres crear uno nuevo basándote en él:

Respuestas

Puedes utilizar la herencia para crear el nuevo constructor extendiendo al primero.

No puedes hacerlo, pues no se puede utilizar herencia con los interfaces; solo con las clases.

Retroalimentación