Menu
Coddy logo textTech

Anonyme Klassen

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

Manchmal benötigst du ein einfaches, einmalig verwendetes Objekt, ohne den Aufwand, eine vollständige Klasse zu definieren. Mit anonymen Klassen kannst du Objekte spontan genau dort erstellen, wo du sie brauchst. Sie sind besonders nützlich in Kombination mit Dependency Injection.

Eine anonyme Klasse wird mit new class definiert, gefolgt vom Klassenkörper:

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

Ausgabe:

Log: Hello!

Anonyme Klassen werden bei der Implementierung von Schnittstellen besonders leistungsfähig. Das ist ideal für Tests oder wenn du schnell eine Implementierung benötigst, ohne deine Codebasis mit Klassen zu überladen, die nur einmal verwendet werden:

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

Ausgabe:

Sent: Test message

Anonyme Klassen können auch andere Klassen erweitern, Traits verwenden und Konstruktorargumente akzeptieren. Sie haben vollständigen Zugriff auf OOP-Funktionen – sie werden lediglich inline statt in einer separaten Datei definiert. Verwende sie, wenn eine vollständige Klassendefinition übertrieben wäre, du aber dennoch objektorientiertes Verhalten benötigst.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Datenformatierungssystem, das die Leistungsfähigkeit anonymer Klassen demonstriert. Anstatt separate Klassendateien für einfache, einmalige Implementierungen zu erstellen, verwendest du anonyme Klassen, um schnelle Implementierungen genau dort zu erstellen, wo du sie benötigst.

Du organisierst deinen Code über zwei Dateien:

  • FormatterInterface.php: Definiere ein Interface namens FormatterInterface mit einer einzigen Methode format(string $data): string. Dadurch wird der Vertrag festgelegt, den jeder Formatter einhalten muss.
  • main.php: Binde die Interface-Datei ein und erstelle eine Klasse DataProcessor, die Dependency Injection verwendet, um jeden Formatter zu akzeptieren. Die Klasse sollte:
    • in ihrem Konstruktor ein FormatterInterface akzeptieren
    • eine Methode process(string $data) besitzen, die die Verarbeitung an den injizierten Formatter delegiert und dessen Ergebnis zurückgibt

    Du erhältst zwei Eingaben: einen Formattyp ("upper" oder "reverse") und einen zu formatierenden String.

    Erstelle basierend auf dem Formattyp eine anonyme Klasse, die FormatterInterface implementiert:

    • Für "upper": Die Methode format() sollte die Daten in Großbuchstaben umgewandelt zurückgeben
    • Für "reverse": Die Methode format() sollte die Daten umgekehrt zurückgeben

    Injiziere deine anonyme Klasse in einen DataProcessor, rufe process() mit dem Eingabe-String auf und gib das Ergebnis aus.

Dieser Ansatz ist ideal, wenn du eine schnelle Implementierung benötigst, ohne deine Codebasis mit Klassendateien für den einmaligen Gebrauch zu überladen. Die anonyme Klasse wird inline erstellt, implementiert das erforderliche Interface und kann überall dort übergeben werden, wo dieses Interface erwartet wird.

Probier es selbst

<?php
require_once 'FormatterInterface.php';

// TODO: Erstelle eine DataProcessor-Klasse, die:
// - ein FormatterInterface in ihrem Konstruktor akzeptiert
// - eine process(string $data)-Methode hat, die an den Formatter delegiert

// Eingabe lesen
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));

// TODO: Based on $formatType ("upper" or "reverse"), create an anonymous class
// die FormatterInterface implementiert
// - Für "upper": format() sollte die Großbuchstabenversion der Daten zurückgeben
// - Für "reverse": format() sollte die umgekehrte Version der Daten zurückgeben

// TODO: Create a DataProcessor with your anonymous class formatter
// Rufe process() mit dem Eingabestring auf und gib das Ergebnis 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