Menu
Coddy logo textTech

Schnittstellen implementieren

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

Nachdem du nun verstanden hast, was Schnittstellen sind, sehen wir uns an, wie man sie tatsächlich implementiert. Eine Klasse implementiert eine Schnittstelle mithilfe des Schlüsselworts implements und muss konkrete Implementierungen für alle in dieser Schnittstelle deklarierten Methoden bereitstellen.

<?php
interface Printable {
    public function print();
}

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

Ausgabe:

Printing: Hello World

Die Klasse Document implementiert Printable, indem sie ihre eigene Version der print()-Methode bereitstellt. Wenn du vergisst, eine erforderliche Methode zu implementieren, löst PHP einen schwerwiegenden Fehler aus.

Verschiedene Klassen können dieselbe Schnittstelle auf ihre eigene Weise implementieren:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

Ausgabe:

Invoice Total: $150

Sowohl Document als auch Invoice erfüllen den Printable-Vertrag, aber jeder behandelt das Drucken je nach seinem Zweck unterschiedlich.

Wichtiger Punkt: Verwende implements, um eine Klasse mit einem Interface zu verbinden, und definiere anschließend alle erforderlichen Methoden. Jede implementierende Klasse stellt ihre eigene Logik bereit und garantiert gleichzeitig, dass dieselben Methodensignaturen vorhanden sind.

challenge icon

Aufgabe

Einfach

Erstelle ein Nachrichtensystem, das veranschaulicht, wie verschiedene Klassen dieselbe Schnittstelle auf jeweils eigene Weise implementieren können.

Du wirst drei Dateien erstellen, die zusammenarbeiten, um verschiedene Nachrichtentypen zu verarbeiten:

  • Messageable.php: Definiere die Schnittstelle Messageable mit zwei Methodensignaturen: compose($content) und deliver(). Diese Schnittstelle legt den Vertrag fest, den alle Nachrichtentypen erfüllen müssen.
  • Email.php: Erstelle eine Email-Klasse, die Messageable implementiert. Binde die Schnittstellendatei am Anfang ein. Die Klasse sollte eine private Eigenschaft $recipient und eine private Eigenschaft $body besitzen. Der Konstruktor akzeptiert die Empfängeradresse. Implementiere compose($content), um den Inhalt in $body zu speichern und "Email composed" zurückzugeben. Implementiere deliver(), um "Email to [recipient]: [body]" zurückzugeben.
  • SMS.php: Erstelle eine SMS-Klasse, die ebenfalls Messageable implementiert. Binde die Schnittstellendatei am Anfang ein. Die Klasse sollte eine private Eigenschaft $phoneNumber und eine private Eigenschaft $text besitzen. Der Konstruktor akzeptiert die Telefonnummer. Implementiere compose($content), um den Inhalt in $text zu speichern und "SMS composed" zurückzugeben. Implementiere deliver(), um "SMS to [phoneNumber]: [text]" zurückzugeben.

Binde in main.php sowohl die Dateien für Email als auch für SMS ein. Du erhältst drei Eingaben: eine E-Mail-Adresse, eine Telefonnummer und einen Nachrichteninhalt. Erstelle ein Email-Objekt mit der E-Mail-Adresse und ein SMS-Objekt mit der Telefonnummer. Rufe bei beiden Objekten compose() mit dem Nachrichteninhalt auf und gib jedes Ergebnis in einer eigenen Zeile aus. Rufe anschließend bei beiden Objekten deliver() auf und gib jedes Ergebnis in einer eigenen Zeile aus. Die Reihenfolge sollte sein: Email compose, SMS compose, Email deliver, SMS deliver.

Beide Klassen erfüllen denselben Messageable-Vertrag, aber jede verarbeitet das Erstellen und Zustellen von Nachrichten entsprechend ihrem eigenen Zweck: E-Mails zeigen die Empfängeradresse an, während SMS-Nachrichten die Telefonnummer anzeigen.

Probier es selbst

<?php
require_once 'Email.php';
require_once 'SMS.php';

// Eingaben lesen
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: Erstelle ein Email-Objekt mit der E-Mail-Adresse

// TODO: Erstelle ein SMS-Objekt mit der Telefonnummer

// TODO: Rufe compose() auf beiden Objekten auf und gib die Ergebnisse aus
// Order: email compose, then SMS compose

// TODO: Rufe deliver() auf beiden Objekten auf und gib die Ergebnisse aus
// Reihenfolge: email deliver, dann SMS deliver
?>
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