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 una clase principal, PHP permite que una clase implemente varias interfaces. Esto te da la flexibilidad de combinar diferentes contratos, haciendo que tus clases sean más versátiles.
Para Implementar múltiples interfaces, sepáralas 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 ambos contratos al implementar todos los methods de Printable y Savable. Debes proporcionar implementaciones para cada method declarado en cada interfaz.
Este enfoque es potente porque te permite crear clases que cumplen múltiples requisitos sin las limitaciones de la herencia única. Una clase puede ser imprimible, guardable, exportable y mucho más, todo al mismo tiempo.
Punto clave: Usa comas para implementar varias 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 varias interfaces para obtener distintas capacidades.
Crearás cuatro archivos que funcionan conjuntamente para gestionar archivos multimedia que se pueden reproducir y compartir:
Playable.php: Define una interfazPlayablecon una única firma de método:play(). Este contrato garantiza que cualquier contenido multimedia reproducible pueda iniciarse.Shareable.php: Define una interfazShareablecon una única firma de método:share($platform). Este contrato garantiza que cualquier contenido que se pueda compartir pueda distribuirse en distintas plataformas.Video.php: Crea una claseVideoque implemente tantoPlayablecomoShareable. Incluye ambos archivos de interfaz al principio. 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 devolver"Playing video: [title] ([duration] min)". Implementashare($platform)para devolver"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 que se debe convertir en un entero) y el nombre de una plataforma. Crea un objetoVideocon el título y la duración. Imprime el resultado de llamar aplay()en la primera línea; después, imprime el resultado de llamar ashare()con la plataforma en la segunda línea.
Tu clase Video cumple simultáneamente dos contratos independientes. Se puede reproducir como cualquier contenido multimedia y se puede compartir en plataformas sociales. Este es el poder de implementar varias interfaces: una sola clase obtiene capacidades de distintas fuentes sin estar limitada a una única cadena de herencia.
Pruébalo tú mismo
<?php
// Incluir el archivo Video
require_once 'Video.php';
// Leer 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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online