La conversión implícita de cadena en lugar de conseguir “Object ID # ..”
Pregunta
Me he mudado a un nuevo servicio de hosting eran tenemos PHP 5.1 en lugar de 5.2 que he estado usando hasta ahora. Todavía no he descubierto si se trata de un problema de versión de PHP o configuración.
En este momento la mayor parte (o la totalidad) de las clases que tienen funciones __toString Convertir a "# ID del objeto" (como en php4), pero antes de que todos regresaron a los valores correctos.
¿Cómo puedo solucionar este problema?
Solución
Al parecer antes de PHP 5.2 el método __toString
fue sólo "mágicamente" llamada en ciertas circunstancias (por ejemplo echo()
y print()
). Así que si usted está usando actualmente __toString()
de una manera "mágica" fuera de las funciones de salida directa no funcionará como se espera.
Fuente :
Vale la pena señalar que antes de PHP 5.2.0 el método
__toString
solamente fue llamado cuando se combinó directamente conecho()
oprint()
. A partir de PHP 5.2.0, se llama en cualquier contexto de cadena (por ejemplo, enprintf()
con%s
modificador) pero no en otros tipos contextos (por ejemplo, con modificador%d
). A partir de PHP 5.2.0, objetos de conversión sin método__toString
de cadena causaríaE_RECOVERABLE_ERROR
.
Otros consejos
Algunas empresas de acogida (como 1and1) corren tanto PHP 4.x 5.x y por defecto a 4.x. Puede que tenga que tener un archivo .htaccess que asegura que usted está utilizando la versión correcta de PHP.
Además, el __toString magia () es ligeramente diferente de la versión 5.2 + de acuerdo con la documentación :
Vale la pena señalar que antes de PHP 5.2.0 el método __toString solamente se llama cuando se combinó directamente con echo () o print (). Desde PHP 5.2.0, se llama en cualquier contexto de cadena (por ejemplo, en printf () con el modificador% s) pero no en otros contextos tipos (por ejemplo, con% d modificador). A partir de PHP 5.2.0, la conversión de objetos sin método __toString a cadena causaría E_RECOVERABLE_ERROR.
Por lo tanto, puede depender de la forma en la que está llamando la salida.