echo $begrüßung;
was glaubst du wofür das a in dem aufruf a::methde() steht?
Ja, ich weiß, wofür das steht.
Ich bin ja ein bisschen betriebsblind, aber ich habe in Andis Quelltext keinen Aufruf dieser Art gefunden.
das this bezieht sich immer auf die augenblickliche instanz, welche gerade ausgeführt wird. this kann es dann nicht geben, wenn keine instanz erzeugt wurde und diese nicht die kontrolle erhalten hat.
this hat also nichts mit statischen aufrufen zu tun.
Du weißt, dass das so ist, und ich weiß das auch. Es scheint mir aber so, als ob es hier ein Nicht-Verständigungspotitial für weniger Erfahrene gibt. Deswegen würde ich hier gern noch ein kleines Beispiel bringen.
class foo {
var $x;
function baz() {
echo $this->x;
}
function bar() {
$this->x = 42;
foo::baz();
}
}
$bla = new foo();
$bla->bar();
//foo::baz();
Wir haben nun eine Instanz von foo, also quasi auch ein $this. Dieses benutzen wir in bar() um $this->x einen Wert zuzuweisen. Soweit so gut. Nun folgt jedoch ein statischer Methodenaufruf foo::baz(); und man könnte meinen, da $this eben noch existiert hat, lässt es sich auch in baz() verwenden. Es ist ja schließlich auch dieselbe Klasse. Doch das täuscht. Ruft man eine Methode statisch auf, so wird diese Methode so angesehen, als ob es eine ganz normale sonstwo definierte Funktion sei, also ohne Klasse drumrum. In "normalen" Funktionen gibt es unter PHP aber per Default keinen Zugriff auf Variablen, die nicht innerhalb der Funktion definiert wurden. Also existiert auch kein $this und echo $this->x; erzeugt eine Fehlermeldung.
Soweit die Theorie. Noch schnell ein Test mit dem Code ausgeführt und ... keine Fehlermeldung, stattdessen wird 42 ausgegeben. Was nun? War da nicht ein statischer Methodenaufruf foo::baz()?
Des Rätsels Lösung ergibt sich aus dem Aufruf-Kontext von foo::baz(). Im Beispiel wurde es aus einer Methode (bar()) einer vorhandenen Instanz ($bla) heraus aufgerufen. Dabei erfolgt also kein statischer Aufruf trotz der statischen Notation klassenname::methode().
Entfernt man nun die Kommentarzeichen der letzten Zeile, gibt es wie erwartet eine Fehlermeldung. Dieser Aufruf ist nun wirklich statisch. (Zum Nachvollziehen der Fehlermeldungen bitte das error_reporting auf E_ALL stellen. Die Meldung ist "nur" eine Notice, die standardmäßig nicht ausgegeben werden.)
Soweit so eigenartig. Nehmen wir ein zweites Beispiel
class foo1 {
var $x;
function bar() {
$this->x = 42;
foo2::baz();
}
}
class foo2 {
var $x = 43;
function baz() {
echo $this->x;
}
}
$bla = new foo1();
$bla->bar();
//foo2::baz();
Die Klassen foo1 und foo2 sind eigenständig. Keine verwandschaftlichen Beziehungen (Vererbung) bestehen zwischen ihnen. Trotzdem ergibt es keine Fehlermeldung sondern 42. Wieso kann die Methode einer Klasse auf Eigeschaften einer anderen Klasse und noch dazu über $this zugreifen? Hier wird offensichtlich die Methode baz() von foo2 einfach so in den Kontext von $bla gebracht. Also wieder kein statischer Aufruf.
Der Test mit der auskommentierten Codezeile ergibt wie erwartet eine Fehlermeldung beim Zugriff auf $this. Dieser Aufruf von außerhalb einer Klasse war also statisch.
echo "$verabschiedung $name";