
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.
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. |