Menu
Coddy logo textTech

Mehrfache Interface-Implementierung

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 29 von 91.

Im Gegensatz zur Vererbung, bei der eine Klasse nur eine Basisklasse erweitern kann, erlaubt PHP einer Klasse, mehrere Interfaces zu implementieren. Dies gibt Ihnen die Flexibilität, verschiedene Verträge zu kombinieren, was Ihre Klassen vielseitiger macht.

Um mehrere Interfaces zu implementieren, trennen Sie diese durch Kommas nach dem implements-Schlüsselwort:

<?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();

Ausgabe:

Printing: Sales Report
Saving: Sales Report

Die Klasse Report erfüllt beide Verträge, indem sie alle Methoden von Printable und Savable implementiert. Sie müssen Implementierungen für jede Methode bereitstellen, die in jedem Interface deklariert ist.

Dieser Ansatz ist leistungsstark, da er es Ihnen ermöglicht, Klassen zu erstellen, die mehrere Anforderungen erfüllen, ohne die Einschränkungen der Einzelvererbung. Eine Klasse kann gleichzeitig druckbar, speicherbar, exportierbar und vieles mehr sein.

Wichtiger Punkt: Verwenden Sie Kommas, um mehrere Interfaces zu implementieren. Ihre Klasse muss konkrete Implementierungen für alle Methoden von jedem Interface bereitstellen, das sie implementiert.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Mediendateisystem aufbauen, das demonstriert, wie eine einzelne Klasse mehrere Interfaces implementieren kann, um verschiedene Fähigkeiten zu erlangen.

Sie werden vier Dateien erstellen, die zusammenarbeiten, um Mediendateien zu verarbeiten, die sowohl abgespielt als auch geteilt werden können:

  • Playable.php — Definieren Sie ein Playable Interface mit einer einzigen Methodensignatur: play(). Dieser Vertrag stellt sicher, dass jedes abspielbare Medium gestartet werden kann.
  • Shareable.php — Definieren Sie ein Shareable Interface mit einer einzigen Methodensignatur: share($platform). Dieser Vertrag stellt sicher, dass jeder teilbare Inhalt auf verschiedenen Plattformen verbreitet werden kann.
  • Video.php — Erstellen Sie eine Video Klasse, die sowohl Playable als auch Shareable implementiert. Binden Sie beide Interface-Dateien oben ein. Die Klasse sollte eine private $title Eigenschaft und eine private $duration Eigenschaft (in Minuten) haben. Der Konstruktor akzeptiert den Titel und die Dauer. Implementieren Sie play(), um "Playing video: [title] ([duration] min)" zurückzugeben. Implementieren Sie share($platform), um "Sharing [title] on [platform]" zurückzugeben.
  • main.php — Binden Sie die Video-Datei ein. Sie erhalten drei Eingaben: den Videotitel, die Dauer (als String, der in einen Integer umgewandelt werden muss) und einen Plattformnamen. Erstellen Sie ein Video Objekt mit dem Titel und der Dauer. Geben Sie das Ergebnis des Aufrufs von play() in der ersten Zeile aus und geben Sie dann das Ergebnis des Aufrufs von share() mit der Plattform in der zweiten Zeile aus.

Ihre Video Klasse erfüllt zwei separate Verträge gleichzeitig — sie kann wie jedes Medium abgespielt werden und sie kann auf sozialen Plattformen geteilt werden. Dies ist die Stärke der Implementierung mehrerer Interfaces: Eine einzelne Klasse erhält Fähigkeiten aus verschiedenen Quellen, ohne auf eine einzige Vererbungskette beschränkt zu sein.

Spickzettel

Eine Klasse kann mehrere Interfaces implementieren, indem sie diese nach dem Schlüsselwort implements durch Kommas trennt:

<?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";
    }
}

Die Klasse muss konkrete Implementierungen für alle Methoden aus jedem Interface bereitstellen, das sie implementiert. Dies ermöglicht es einer Klasse, mehrere Verträge gleichzeitig zu erfüllen, ohne die Einschränkungen der Einzelvererbung.

Probier es selbst

<?php
// Binde die Video-Datei ein
require_once 'Video.php';

// Eingaben lesen
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));

// TODO: Erstelle ein Video-Objekt mit dem Titel und der Dauer

// TODO: Gib das Ergebnis des Aufrufs von play() in der ersten Zeile aus

// TODO: Gib das Ergebnis des Aufrufs von share() mit der Plattform in der zweiten Zeile aus

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung