Wann verwendet man self und wann $this? Wir klären es ein für alle Mal
\n\nWenn du schon einmal objektorientiert in PHP programmiert hast, bist du bestimmt auf die Frage gestoßen: „Was soll ich nun nehmen – self oder $this?“. Diese Frage ist so beliebt, dass sie auf Stack Overflow zehntausende Aufrufe und hunderte Kommentare gesammelt hat. Und das nicht ohne Grund: Der Unterschied zwischen ihnen ist eines dieser „Kleinigkeiten“, die deinen Code entweder funktionierend, aber undurchsichtig, oder elegant und verständlich machen können.
Lass uns gleich klarstellen: Diese beiden Dinge sind nicht austauschbar. Sie haben eine unterschiedliche Philosophie und, was noch wichtiger ist, ein unterschiedliches Verhalten bei der Vererbung. Wenn du $this dort verwendest, wo self hingehört, oder umgekehrt – riskierst du logische Fehler, die schwer zu finden sind.
In diesem Artikel ordnen wir alles von der Basis bis zu fortgeschrittenen Szenarien. Los geht's!
\n\n\n\n
Die Kurzantwort (für alle, die es eilig haben)
\n\nWenn du dir nur eine Regel merken willst, dann diese:
\n\n- \n
$this->– für den Zugriff auf Eigenschaften und Methoden einer Instanz (eines Objekts). Funktioniert nur im nicht-statischen Kontext. \n self::– für den Zugriff auf statische Eigenschaften und Methoden einer Klasse. Funktioniert sowohl im statischen als auch im nicht-statischen Kontext. \n static::– „späte statische Bindung“ (Late Static Binding). Wird verwendet, wenn eine Kindklasse das Verhalten der Elternklasse überschreiben soll. \n
Aber der Teufel steckt, wie immer, im Detail. Tauchen wir tiefer ein.
\n\nWas ist $this?
\n\n$this ist eine Pseudovariable, die auf das aktuelle Objekt verweist. Sie ist nur innerhalb von Methoden einer Klasse (nicht statisch) verfügbar und zeigt auf genau die Instanz, mit der du arbeitest.
<?php\n\nclass User {\n public string $name;\n\n public function setName(string $name): void {\n $this->name = $name; // Zugriff auf die Eigenschaft des aktuellen Objekts\n }\n\n public function getName(): string {\n return $this->name;\n }\n}\n\n$user = new User();\n$user->setName('Anna');\necho $user->getName(); // Anna\n\nGanz einfach: $this->name bedeutet „nimm die Eigenschaft name von dem Objekt, das diese Methode aufgerufen hat“.
Was ist self?
\n\nself ist ein Verweis auf die aktuelle Klasse, nicht auf ein Objekt. Es wird verwendet, um auf statische Mitglieder einer Klasse zuzugreifen (Eigenschaften und Methoden, die mit dem Schlüsselwort static deklariert wurden).
<?php\n\nclass Config {\n public static string $appName = 'PythonLib';\n\n public static function getAppName(): string {\n return self::$appName; // Zugriff auf die statische Eigenschaft der Klasse\n }\n}\n\necho Config::getAppName(); // PythonLib\n\nBeachte: self verweist immer auf die Klasse, in der es geschrieben wurde. Selbst wenn du einen Nachkommen erstellst, zeigt self in der Elternklasse weiterhin auf die Elternklasse. Das ist der wichtigste Unterschied zu static.
Der Hauptunterschied: self vs $this bei der Vererbung
\n\nHier wird es richtig interessant. Stell dir vor, du hast eine Basisklasse Animal und eine Kindklasse Dog.
<?php\n\nclass Animal {\n public static function whoAmI(): string {\n return 'Ich bin ein Tier';\n }\n\n public function say(): string {\n // Wir verwenden self – es ist an die Klasse Animal gebunden\n return self::whoAmI();\n }\n}\n\nclass Dog extends Animal {\n public static function whoAmI(): string {\n return 'Ich bin ein Hund';\n }\n}\n\n$dog = new Dog();\necho $dog->say(); // Ich bin ein Tier