PHP Methode wird aufgerufen, obwohl nicht Static?
-
Versteh nicht, warum ich den Fehler bekomm? Es existiert doch keine statische Methode fun::test? Würde es über __callStatic laufen, müsste ich keinen Fehler bekommen. Kann mir das Bitte einer erklären
<? class fun{ private $tt = '1123'; public function test(){ echo $this->tt; } public static function __callStatic($fn,$args){ return call_user_func_array(array(new fun(),$fn),$args); } } fun::test();
Ausgabe
Fatal error: Using $this when not in object context on line 6
Mit:
private function test(){ geht es und läuft über __callStatic
-
Der Code sollte eine E_STRICT warnung werfen.
Aus kompatibilitätsgründen ist es nämlich möglich eine memberfunktion static zu callen obwohl sie nicht static deklariert ist. das generiert ein E_STRICT und beim aufruf der funktion gibt es natürlich kein $this.
Man kann Memberfunktionen nicht anhand ihrer attribute (zB static) überladen. Deshalb wird __callStatic nie aufgerufen, da es ja schon eine Funktion test() gibt.
PS:
du kannst aber mit isset($this) in test() testen ob die funktion static gecalled wurde.PPS:
zu deinem Edit: wenn test() private ist, dann wird es bei
func::test() nicht in die auflösung mit einbezogen, da test() unsichtbar ist (das ist anders als in c++) und deshalb wird __callStatic aufgerufen weil kein test() gefunden wurde. wenn test aber public ist, dann gibt es test und test kann aufgerufen werden, ergo kein __callStatic.Wenn es notwendig sein sollte anhand static-ness zu überladen, kann das per proxy klasse und __call und __callStatic gemacht werden - dazu eine klasse nehmen und keine anderen public member als __call und __callStatic nehmen und diese leiten dann weiter auf das ziel objekt.
-
Vielen Dank, war echt schon am verzweifeln.