Menu
Coddy logo textTech

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 Report

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

challenge icon

Desafío

Fácil

Construyamos 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 interfaz Playable con una única firma de método: play(). Este contrato asegura que cualquier medio reproducible pueda ser iniciado.
  • Shareable.php — Define una interfaz Shareable con 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 clase Video que implemente tanto Playable como Shareable. Incluye ambos archivos de interfaz en la parte superior. La clase debe tener una propiedad privada $title y una propiedad privada $duration (en minutos). El constructor acepta el título y la duración. Implementa play() para que devuelva "Playing video: [title] ([duration] min)". Implementa share($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 objeto Video con el título y la duración. Imprime el resultado de llamar a play() en la primera línea, luego imprime el resultado de llamar a share() 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

?>
quiz iconPonte a prueba

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