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 😞 😕


  • Mod

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


Anmelden zum Antworten