Menu
Coddy logo textTech

Mehrere Schnittstellen implementieren

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

Im Gegensatz zur Vererbung, bei der eine Klasse nur eine übergeordnete Klasse erweitern kann, ermöglicht PHP einer Klasse, mehrere Schnittstellen zu implementieren. Dadurch kannst du verschiedene Verträge kombinieren und deine Klassen vielseitiger gestalten.

Um mehrere Schnittstellen zu implementieren, trenne sie nach dem Schlüsselwort implements durch Kommas:

<?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 aus Printable und Savable implementiert. Du musst Implementierungen für jede in den einzelnen Schnittstellen deklarierte Methode bereitstellen.

Dieser Ansatz ist leistungsfähig, weil du damit Klassen erstellen kannst, die mehrere Anforderungen erfüllen, ohne den Einschränkungen der Einfachvererbung zu unterliegen. Eine Klasse kann gleichzeitig druckbar, speicherbar, exportierbar und vieles mehr sein.

Wichtiger Punkt: Verwende Kommas, um mehrere Schnittstellen zu implementieren. Deine Klasse muss konkrete Implementierungen für alle Methoden aus jeder Schnittstelle bereitstellen, die sie implementiert.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Mediadateisystem, das veranschaulicht, wie eine einzelne Klasse mehrere Schnittstellen implementieren kann, um verschiedene Fähigkeiten zu erlangen.

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

  • Playable.php: Definiere eine Playable-Schnittstelle mit einer einzigen Methodensignatur: play(). Dieser Vertrag stellt sicher, dass jedes abspielbare Medium gestartet werden kann.
  • Shareable.php: Definiere eine Shareable-Schnittstelle mit einer einzigen Methodensignatur: share($platform). Dieser Vertrag stellt sicher, dass alle teilbaren Inhalte auf verschiedenen Plattformen verbreitet werden können.
  • Video.php: Erstelle eine Video-Klasse, die sowohl Playable als auch Shareable implementiert. Binde beide Schnittstellendateien am Anfang ein. Die Klasse sollte eine private $title-Eigenschaft und eine private $duration-Eigenschaft (in Minuten) besitzen. Der Konstruktor akzeptiert den Titel und die Dauer. Implementiere play(), sodass "Playing video: [title] ([duration] min)" zurückgegeben wird. Implementiere share($platform), sodass "Sharing [title] on [platform]" zurückgegeben wird.
  • main.php: Binde die Datei Video ein. Du erhältst drei Eingaben: den Videotitel, die Dauer (als Zeichenfolge, die in eine Ganzzahl umgewandelt werden soll) und einen Plattformnamen. Erstelle ein Video-Objekt mit dem Titel und der Dauer. Gib das Ergebnis des Aufrufs von play() in der ersten Zeile aus und anschließend das Ergebnis des Aufrufs von share() mit der Plattform in der zweiten Zeile.

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

Probier es selbst

<?php
// Video-Datei einbinden
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

Übe selbstständig: Online-PHP-Compiler