Einleitung: Warum quält diese Frage jeden zweiten PHP-Entwickler?
\n\nWenn Sie jemals objektorientiert in PHP programmiert haben, sind Sie definitiv auf das Dilemma gestoßen: Wann verwendet man self und wann $this? Diese Frage ist eine der beliebtesten auf Stack Overflow (tausende Aufrufe und Dutzende Stimmen). Es scheint, dass der Unterschied offensichtlich ist, aber sobald man tiefer gräbt, fangen selbst erfahrene Entwickler an, sich zu verwirren.
In diesem Artikel ordnen wir alles Schritt für Schritt. Sie erfahren:
\n- \n
- Was die grundlegenden Unterschiede zwischen
selfund$thissind; \n - In welchen Situationen jedes von ihnen obligatorisch ist; \n
- Wie Vererbung und statische Kontexte funktionieren; \n
- Und natürlich sehen Sie echte Code-Beispiele, die Sie sofort anwenden können. \n
Legen wir los, um das ein für alle Mal zu klären!
\n\nGrundregel: Statisch vs. Instanz
\n\nDas Wichtigste, was man sich merken sollte:
\n- \n
$this– bezieht sich auf das aktuelle Objekt (Instanz der Klasse). Funktioniert nur im nicht-statischen Kontext. \n self– bezieht sich auf die aktuelle Klasse, in der der Code geschrieben ist. Wird für den Zugriff auf statische Eigenschaften, Konstanten und statische Methoden verwendet. \n
Klingt einfach? Lassen Sie es uns anhand eines Beispiels überprüfen.
\n\nBeispiel 1: Einfache Klasse
\n<?php\nclass Coffee\n{\n public static $type = 'Arabica';\n public $sugar = 2;\n\n public function info()\n {\n // $this – für Objekteigenschaften\n echo "Zucker: {$this->sugar} Löffel.";\n\n // self – für statische Eigenschaft\n echo "Kaffeesorte: " . self::$type;\n }\n}\n\n$cup = new Coffee();\n$cup->info(); // Gibt aus: Zucker: 2 Löffel. Kaffeesorte: Arabica\n?>\n\nHier ist alles logisch: $this->sugar ist für jede Tasse einzigartig, und self::$type ist für alle gleich.
Tücke der Vererbung: self vs static
\n\nUnd hier wird es richtig interessant. Viele denken, dass self polymorph ist, aber das stimmt nicht. self zeigt immer auf die Klasse, in der es geschrieben ist, selbst wenn Sie die Methode aus einer untergeordneten Klasse aufrufen.
Wenn Sie möchten, dass der Code die Klasse berücksichtigt, von der aus er aufgerufen wurde (späte statische Bindung), verwenden Sie static.
Beispiel 2: Vererbung und die Falle
\n<?php\nclass Animal\n{\n public static $sound = '...';\n\n public static function speak()\n {\n // ACHTUNG: self ist Animal, nicht Dog!\n echo self::$sound;\n }\n\n public static function speakCorrect()\n {\n // static ist die Klasse, die die Methode aufgerufen hat\n echo static::$sound;\n }\n}\n\nclass Dog extends Animal\n{\n public static $sound = 'Wuff!';\n}\n\nDog::speak(); // Gibt aus: ... (weil self = Animal)\nDog::speakCorrect(); // Gibt aus: Wuff! (weil static = Dog)\n?>\n\nDieses Beispiel ist eine häufige Ursache für Fehler. Wenn Sie eine Bibliothek schreiben und erwarten, dass untergeordnete Klassen statische Eigenschaften überschreiben können, verwenden Sie immer static anstelle von self.
Wann kommt man ohne self nicht aus?
\n\nEs gibt Situationen, in denen $this einfach nicht funktioniert und self die einzige Option ist:
- \n
- Statische Methoden: Innerhalb einer Methode, die als
public static functiondeklariert ist, gibt es kein Objekt, daher ist$thisnicht verfügbar. Nurself. \n - Klassenkonstanten: Auf sie wird über
self::CONSTANT(oderClassName::CONSTANT) zugegriffen. \n - Statische Eigenschaften:
self::$property. \n - Innerhalb des Konstruktors oder Destruktors: Obwohl dort
$thisverfügbar ist, ist es für statische Operationen besser,selfzu verwenden. \n