Introducción a las Interfaces
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 27 de 91.
Una interfaz define un contrato que las clases deben seguir. A diferencia de las clases abstractas que pueden contener tanto métodos abstractos como concretos, una interfaz solo declara firmas de métodos sin ninguna implementación. Piénselo como una promesa: cualquier clase que implemente una interfaz garantiza que proporcionará esos métodos específicos.
Se define una interfaz utilizando la palabra clave interface:
<?php
interface Printable {
public function print();
}
Esta interfaz declara que cualquier clase que implemente Printable debe tener un método print(). A la interfaz no le importa cómo funciona el método, solo que exista.
Aquí tienes un ejemplo sencillo que muestra la estructura básica:
<?php
interface Drivable {
public function start();
public function stop();
}
Observa que los métodos de la interfaz no tienen cuerpo, solo la firma que termina con un punto y coma. Todos los métodos en una interfaz son implícitamente públicos, por lo que no puedes usar private o protected.
Las interfaces son potentes porque permiten que clases no relacionadas compartan un comportamiento común. Un Car y una Motorcycle podrían no tener nada en común en cuanto a herencia, pero ambos pueden implementar Drivable para garantizar que tengan los métodos start() y stop().
Punto clave: Una interfaz define qué métodos debe tener una clase, no cómo deben funcionar. Establece un contrato que las clases que la implementan deben cumplir.
Desafío
FácilVamos a construir un sistema de mensajería simple que te introducirá a las interfaces. Definirás una interfaz que establece un contrato sobre cómo deben manejarse los mensajes, sentando las bases para las clases implementadoras que crearás en la próxima lección.
Organizarás tu código en dos archivos:
Messageable.php— Define una interfaz llamadaMessageableque declare dos firmas de métodos:compose($content)para crear un mensaje, ydeliver()para enviarlo. Recuerda, los métodos de una interfaz no tienen cuerpo — solo la firma terminando con un punto y coma.main.php— Incluye el archivo Messageable. Para verificar que tu interfaz esté correctamente definida, usa la funcióninterface_exists()de PHP para comprobar siMessageableexiste. Luego, usaReflectionClasspara inspeccionar tu interfaz y listar sus métodos. Crea una reflexión de tu interfaz, obtén sus métodos usandogetMethods(), e imprime cada nombre de método en su propia línea.
Tu salida debería mostrar los dos nombres de los métodos que declara tu interfaz, cada uno en una línea separada, en el orden en que los definiste.
Este desafío se centra puramente en definir una interfaz — el contrato que las futuras clases deberán cumplir. Estás estableciendo qué métodos deben existir, sin preocuparte por cómo funcionarán. ¡Esa implementación vendrá en la próxima lección!
Hoja de referencia
Una interfaz define un contrato que las clases deben seguir. Solo declara las firmas de los métodos sin ninguna implementación.
Define una interfaz utilizando la palabra clave interface:
<?php
interface Printable {
public function print();
}
Los métodos de la interfaz no tienen cuerpo, solo la firma que termina con un punto y coma. Todos los métodos en una interfaz son implícitamente públicos.
<?php
interface Drivable {
public function start();
public function stop();
}
Las interfaces permiten que clases no relacionadas compartan un comportamiento común al garantizar que implementen métodos específicos.
Pruébalo tú mismo
<?php
// Incluir el archivo de la interfaz Messageable
require_once 'Messageable.php';
// TODO: Usar interface_exists() para comprobar si la interfaz Messageable existe
// TODO: Crear un objeto ReflectionClass para la interfaz Messageable
// TODO: Obtener los métodos usando getMethods()
// TODO: Recorrer los métodos e imprimir el nombre de cada método en su propia línea
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy