Menu
Coddy logo textTech

Interfaces implementieren

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

Nachdem Sie nun verstanden haben, was Interfaces sind, schauen wir uns an, wie man sie tatsächlich implementiert. Eine Klasse implementiert ein Interface unter Verwendung des Schlüsselworts implements und muss konkrete Implementierungen für alle in diesem Interface 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 Methode print() bereitstellt. Wenn Sie vergessen, eine erforderliche Methode zu implementieren, wird PHP einen fatalen Fehler auslösen.

Verschiedene Klassen können dasselbe Interface 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 jedes verarbeitet das Drucken je nach Verwendungszweck unterschiedlich.

Wichtiger Punkt: Verwenden Sie implements, um eine Klasse mit einem Interface zu verbinden, und definieren Sie dann alle erforderlichen Methoden. Jede implementierende Klasse bietet ihre eigene Logik, während sie garantiert, dass dieselben Methodensignaturen existieren.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Nachrichtensystem bauen, das demonstriert, wie verschiedene Klassen dasselbe Interface auf ihre eigene, einzigartige Weise implementieren können.

Sie werden drei Dateien erstellen, die zusammenarbeiten, um verschiedene Arten von Nachrichten zu verarbeiten:

  • Messageable.php — Definieren Sie das Messageable-Interface mit zwei Methodensignaturen: compose($content) und deliver(). Dieses Interface legt den Vertrag fest, dem alle Nachrichtentypen folgen müssen.
  • Email.php — Erstellen Sie eine Email-Klasse, die Messageable implementiert. Binden Sie die Interface-Datei am Anfang ein. Die Klasse sollte eine private $recipient-Eigenschaft und eine private $body-Eigenschaft haben. Der Konstruktor akzeptiert die Empfängeradresse. Implementieren Sie compose($content), um den Inhalt in $body zu speichern und "Email composed" zurückzugeben. Implementieren Sie deliver(), um "Email to [recipient]: [body]" zurückzugeben.
  • SMS.php — Erstellen Sie eine SMS-Klasse, die ebenfalls Messageable implementiert. Binden Sie die Interface-Datei am Anfang ein. Die Klasse sollte eine private $phoneNumber-Eigenschaft und eine private $text-Eigenschaft haben. Der Konstruktor akzeptiert die Telefonnummer. Implementieren Sie compose($content), um den Inhalt in $text zu speichern und "SMS composed" zurückzugeben. Implementieren Sie deliver(), um "SMS to [phoneNumber]: [text]" zurückzugeben.

In main.php binden Sie sowohl die Email- als auch die SMS-Dateien ein. Sie erhalten drei Eingaben: eine E-Mail-Adresse, eine Telefonnummer und einen Nachrichtentext. Erstellen Sie ein Email-Objekt mit der E-Mail-Adresse und ein SMS-Objekt mit der Telefonnummer. Rufen Sie compose() mit dem Nachrichtentext für beide Objekte auf und geben Sie jedes Ergebnis in einer eigenen Zeile aus. Rufen Sie dann deliver() für beide Objekte auf und geben Sie 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 gemäß ihrem eigenen Zweck — E-Mails zeigen die Empfängeradresse, während SMS-Nachrichten die Telefonnummer zeigen.

Spickzettel

Eine Klasse implementiert ein Interface unter Verwendung des Schlüsselworts implements und muss konkrete Implementierungen für alle in diesem Interface 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;
    }
}

Mehrere Klassen können dasselbe Interface implementieren, wobei jede ihre eigene Implementierung bereitstellt:

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

Wenn eine Klasse nicht alle erforderlichen Methoden eines Interfaces implementiert, wird PHP einen Fatal Error auslösen.

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: Erstellen Sie ein Email-Objekt mit der E-Mail-Adresse

// TODO: Erstellen Sie ein SMS-Objekt mit der Telefonnummer

// TODO: Rufen Sie compose() für beide Objekte auf und geben Sie die Ergebnisse aus
// Reihenfolge: Email compose, dann SMS compose

// TODO: Rufen Sie deliver() für beide Objekte auf und geben Sie 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