Implementación de Múltiples Interfaces
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 29 de 91.
A diferencia de la herencia, donde una clase solo puede extender a un único padre, PHP permite que una clase implemente múltiples interfaces. Esto te brinda la flexibilidad de combinar diferentes contratos, haciendo que tus clases sean más versátiles.
Para implementar múltiples interfaces, sepárelas con comas después de la palabra clave implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
Salida:
Printing: Sales Report
Saving: Sales ReportLa clase Report cumple con ambos contratos al implementar todos los métodos de Printable y Savable. Debe proporcionar implementaciones para cada método declarado en cada interfaz.
Este enfoque es potente porque le permite construir clases que satisfacen múltiples requisitos sin las restricciones de la herencia única. Una clase puede ser imprimible, guardable, exportable y más, todo a la vez.
Punto clave: Usa comas para implementar múltiples interfaces. Tu clase debe proporcionar implementaciones concretas para todos los métodos de cada interfaz que implemente.
Desafío
FácilConstruyamos un sistema de archivos multimedia que demuestre cómo una sola clase puede implementar múltiples interfaces para obtener diferentes capacidades.
Crearás cuatro archivos que trabajan juntos para manejar archivos multimedia que pueden ser tanto reproducidos como compartidos:
Playable.php— Define una interfazPlayablecon una única firma de método:play(). Este contrato asegura que cualquier medio reproducible pueda ser iniciado.Shareable.php— Define una interfazShareablecon una única firma de método:share($platform). Este contrato asegura que cualquier contenido compartible pueda ser distribuido en diferentes plataformas.Video.php— Crea una claseVideoque implemente tantoPlayablecomoShareable. Incluye ambos archivos de interfaz en la parte superior. La clase debe tener una propiedad privada$titley una propiedad privada$duration(en minutos). El constructor acepta el título y la duración. Implementaplay()para que devuelva"Playing video: [title] ([duration] min)". Implementashare($platform)para que devuelva"Sharing [title] on [platform]".main.php— Incluye el archivo Video. Recibirás tres entradas: el título del video, la duración (como una cadena para convertir a un entero) y un nombre de plataforma. Crea un objetoVideocon el título y la duración. Imprime el resultado de llamar aplay()en la primera línea, luego imprime el resultado de llamar ashare()con la plataforma en la segunda línea.
Tu clase Video cumple con dos contratos separados simultáneamente: puede ser reproducida como cualquier medio y puede ser compartida en plataformas sociales. Este es el poder de implementar múltiples interfaces: una sola clase adquiere capacidades de diferentes fuentes sin estar limitada a una única cadena de herencia.
Hoja de referencia
Una clase puede implementar múltiples interfaces separándolas con comas después de la palabra clave implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
public function print() {
return "Printing report";
}
public function save() {
return "Saving report";
}
}La clase debe proporcionar implementaciones concretas para todos los métodos de cada interfaz que implemente. Esto permite que una clase cumpla con múltiples contratos simultáneamente sin las restricciones de la herencia simple.
Pruébalo tú mismo
<?php
// Incluir el archivo Video
require_once 'Video.php';
// Leer las entradas
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Crear un objeto Video con el título y la duración
// TODO: Imprimir el resultado de llamar a play() en la primera línea
// TODO: Imprimir el resultado de llamar a share() con la plataforma en la segunda 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