Diese Fehlermeldung gehört wohl zu den unverständlichsten Fehlermeldungen überhaupt. Um sie zu verstehen muss man erst einmal wissen, was mit T_PAAMAYIM_NEKUDOTAYIM gemeint ist. Das T_ steht für Token, also eines der “Bausteine”, in das der php-Parser den Quellcode unterteilt bevor er ihn ausführt. Und “Paamayim Nekudotayim” ist hebräisch für Doppel-Doppelpunkt. Die Fehlermeldung weist also einfach darauf hin, dass ein :: unerwartet aufgetreten ist.
Was sind die Ursachen und die Lösungen dafür?
1. Falscher Code:
$str = Ätsch;
Durch das & betrachtet php Auml als eine Referenz auf eine Klasse, auf die der Aufruf einer Methode folgen müsste: $str = Ä::tsch();. Vermutlich hat der Programmierer im obigen Beispiel aber eine einfache String-Zuweisung gemeint:
$str = 'Ätsch;';
2. Statischer Aufruf von nicht-statischen Methoden
class foo {
public function bar() {
echo 'bar()';
}
}
foo::bar();Auch dies führt zur oben genannten Fehlermeldung, jedoch nur in Versionen vor 5.3. php ab Version 5.3 gibt endlich eine hilfreichere Fehlermeldung aus: Non-static method foo::bar() should not be called statically. Aus ihr geht hervor, dass versucht wurde, die nicht-statische Methode bar() statisch (::-Operator) zu verwenden.
Abhilfe: entweder die Methode statisch machen:
static public function bar()
oder ein Objekt der Klasse instanziieren und die Methode aufrufen:
$fooObj = new foo;
$fooObj->bar();
3. Statischer Aufruf einer Methode einer dynamisch benannten Klasse
Ab Version 5.3 ist es möglich, beim (statischen) Aufruf einer Methode den Klassennamen dynamisch, also mittels einer Variable anzugeben:
$baz = 'foo';
$baz::bar();
Versionen vor 5.3 schmeißen auch in diesem Fall die eine T_PAAMAYIM_NEKUDOTAYIM-Fehlermeldung (hier natürlich expected T_PAAMAYIM_NEKUDOTAYIM anstatt unexpected).
Abhilfe schafft hier call_user_func:
call_user_func(array($baz, 'bar'), $optionale_parameter);
oder ab php 5.2.3
call_user_func($baz.'::bar', $optionale_parameter);