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 messageAnonyme 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.
Aufgabe
EinfachErstellen 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 namensFormatterInterfacemit einer einzigen Methodeformat(string $data): string. Dadurch wird der Vertrag festgelegt, den jeder Formatter einhalten muss.main.php: Binde die Interface-Datei ein und erstelle eine KlasseDataProcessor, die Dependency Injection verwendet, um jeden Formatter zu akzeptieren. Die Klasse sollte:- in ihrem Konstruktor ein
FormatterInterfaceakzeptieren - 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
FormatterInterfaceimplementiert:- Für
"upper": Die Methodeformat()sollte die Daten in Großbuchstaben umgewandelt zurückgeben - Für
"reverse": Die Methodeformat()sollte die Daten umgekehrt zurückgeben
Injiziere deine anonyme Klasse in einen
DataProcessor, rufeprocess()mit dem Eingabe-String auf und gib das Ergebnis aus.- in ihrem Konstruktor ein
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
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen10Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungDependency InjectionAnonyme KlassenEnums (PHP 8.1)Fibers (PHP 8.1)Objektklonen im DetailGeneratoren & Iteratoren2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler