Einführung in magische Methoden
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 44 von 91.
Magische Methoden sind spezielle Methoden in PHP, die mit doppelten Unterstrichen (__) beginnen und von PHP als Reaktion auf bestimmte Ereignisse oder Aktionen automatisch aufgerufen werden. Du hast bereits zwei davon verwendet: __construct() und __destruct().
Diese Methoden ermöglichen es dir, dich in das interne Verhalten von PHP einzuklinken und anzupassen, wie deine Objekte auf gängige Operationen reagieren.
Zum Beispiel: Was passiert, wenn du versuchst, ein Objekt auszugeben? Oder auf eine Eigenschaft zuzugreifen, die nicht existiert? Magische Methoden geben dir Kontrolle über diese Situationen.
Hier ist ein kurzer Überblick über die am häufigsten verwendeten magischen Methoden:
| Methode | Wird ausgelöst, wenn |
|---|---|
__construct() | ein Objekt erstellt wird |
__destruct() | ein Objekt zerstört wird |
__toString() | ein Objekt als Zeichenkette verwendet wird |
__get() | auf eine nicht definierte Eigenschaft zugegriffen wird |
__set() | eine nicht definierte Eigenschaft festgelegt wird |
__call() | eine nicht definierte Methode aufgerufen wird |
__clone() | ein Objekt geklont wird |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
Ausgabe:
Book: PHP MasteryOhne __toString() würde der Versuch, ein Objekt auszugeben, einen Fehler verursachen. Die magische Methode fängt diese Aktion ab und gibt stattdessen eine Zeichenfolgendarstellung zurück. In den kommenden Lektionen werden wir jede magische Methode ausführlich erkunden.
Aufgabe
EinfachErstellen wir ein Filmkatalogsystem, das dich mit magischen Methoden vertraut macht. Du erstellst eine Movie-Klasse, die __construct() verwendet, um Filmdaten zu initialisieren, und __toString(), um eine übersichtliche Zeichenfolgendarstellung bereitzustellen, wenn das Objekt ausgegeben wird.
Du organisierst deinen Code auf zwei Dateien:
Movie.php: Erstelle eineMovie-Klasse, die Filme in deinem Katalog repräsentiert. Verwende Konstruktor-Promotion, um private Eigenschaften für$title(Zeichenkette),$director(Zeichenkette) und$year(Ganzzahl) zu definieren. Implementiere die magische Methode__toString(), um eine formatierte Zeichenkette zurückzugeben:"[title] ([year]) - Directed by [director]". Dadurch können deine Filmobjekte direkt ausgegeben werden, ohne eine separate Methode aufzurufen.main.php: Binde die Movie-Datei ein. Du erhältst drei Eingaben: einen Filmtitel, den Namen des Regisseurs und ein Erscheinungsjahr. Erstelle mit diesen Werten eineMovie-Instanz (wandle das Jahr in eine Ganzzahl um). Gib anschließend einfach das Filmobjekt direkt aus: Die Methode__toString()wird automatisch aufgerufen, um die Ausgabe zu erzeugen.
Der Zauber von __toString() besteht darin, dass PHP die Methode automatisch aufruft, sobald dein Objekt in einem Zeichenkettenkontext verwendet wird. Statt echo $movie->getInfo(); zu schreiben, kannst du einfach echo $movie; schreiben, und PHP übernimmt die Konvertierung für dich. Dadurch lassen sich deine Objekte intuitiver verwenden.
Probier es selbst
<?php
require_once 'Movie.php';
// Eingabe lesen
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: Erstelle eine Movie-Instanz mit den Eingabewerten
// TODO: Gib das Movie-Objekt direkt aus (die __toString()-Methode wird automatisch aufgerufen)
?>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ätzen2Namespaces & 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