Implizite Konvertierung in einen String statt „Objekt-ID #“ zu erhalten.
Frage
Ich bin zu einem neuen Webhost umgezogen, wo wir PHP 5.1 anstelle von 5.2 haben, das ich bisher verwendet habe.Ich habe immer noch nicht herausgefunden, ob es sich um eine PHP-Version oder ein Konfigurationsproblem handelt.
Im Moment werden die meisten (oder alle) Klassen mit __toString-Funktionen in „Object ID #“ konvertiert (wie in PHP4), aber vorher haben sie alle die richtigen Werte zurückgegeben.
Wie kann ich das beheben?
Lösung
Offenbar vor PHP 5.2 die __toString
Methode war nur „magisch“ bezeichnet unter bestimmten Umständen (z echo()
und print()
). Also, wenn Sie sich gerade __toString()
in einer „magischen“ Art und Weise außerhalb der direkten Ausgabe-Funktionen verwenden wird es nicht funktionieren wie erwartet.
Quelle :
Es ist erwähnenswert, dass vor PHP 5.2.0 wurde die
__toString
Methode nur aufgerufen, wenn es direkt kombiniert wurde mitecho()
oderprint()
. seit PHP 5.2.0 es wird in jedem String-Kontext (z.B. inprintf()
mit%s
genannt Modifikator), aber nicht in anderen Typen Kontexte (z.B. mit%d
modifier). Seit PHP 5.2.0, Konvertieren Objekte ohne__toString
Verfahren zu bespannen verursachen würdeE_RECOVERABLE_ERROR
.
Andere Tipps
Einige Host-Unternehmen (wie 1and1) führen sowohl PHP 4.x als auch 5.x aus und verwenden standardmäßig 4.x.Möglicherweise benötigen Sie eine .htaccess-Datei, die sicherstellt, dass Sie die richtige PHP-Version verwenden.
Außerdem unterscheidet sich die magische Funktion __toString() geringfügig von Version 5.2+ Dokumentation:
Es ist erwähnenswert, dass die __toString-Methode vor PHP 5.2.0 nur aufgerufen wurde, wenn sie direkt mit echo() oder print() kombiniert wurde.Seit PHP 5.2.0 wird es in jedem String-Kontext aufgerufen (z. B.in printf() mit dem Modifikator %s), aber nicht in anderen Typkontexten (z. B.mit %d-Modifikator).Seit PHP 5.2.0 würde die Konvertierung von Objekten ohne __toString-Methode in einen String E_RECOVERABLE_ERROR verursachen.
Es kann also davon abhängen, wie Sie die Ausgabe aufrufen.