self oder $this in PHP: Wann was verwenden? Analyse mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum quält diese Frage jeden zweiten PHP-Entwickler?

\n\n

Wenn 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.

\n\n

In diesem Artikel ordnen wir alles Schritt für Schritt. Sie erfahren:

\n
    \n
  • Was die grundlegenden Unterschiede zwischen self und $this sind;
  • \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
\n\n

Legen wir los, um das ein für alle Mal zu klären!

\n\n

Grundregel: Statisch vs. Instanz

\n\n

Das 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
\n\n

Klingt einfach? Lassen Sie es uns anhand eines Beispiels überprüfen.

\n\n

Beispiel 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\n

Hier ist alles logisch: $this->sugar ist für jede Tasse einzigartig, und self::$type ist für alle gleich.

\n\n

Tücke der Vererbung: self vs static

\n\n

Und 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.

\n\n

Wenn Sie möchten, dass der Code die Klasse berücksichtigt, von der aus er aufgerufen wurde (späte statische Bindung), verwenden Sie static.

\n\n

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\n

Dieses 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.

\n\n

Wann kommt man ohne self nicht aus?

\n\n

Es gibt Situationen, in denen $this einfach nicht funktioniert und self die einzige Option ist:

\n\n
    \n
  • Statische Methoden: Innerhalb einer Methode, die als public static function deklariert ist, gibt es kein Objekt, daher ist $this nicht verfügbar. Nur self.
  • \n
  • Klassenkonstanten: Auf sie wird über self::CONSTANT (oder ClassName::CONSTANT) zugegriffen.
  • \n
  • Statische Eigenschaften: self::$property.
  • \n
  • Innerhalb des Konstruktors oder Destruktors: Obwohl dort $this verfügbar ist, ist es für statische Operationen besser, self zu verwenden.
  • \n

Blogs

Buchempfehlungen