Última respuesta, pero estoy muy sorprendido de que nadie haya mencionado cuál es, posiblemente, la forma "correcta" de implementar esta funcionalidad.
Implemente la interfaz JsonSerializable en su objeto. Esta interfaz define un método abstracto, jsonSerialize
. Ese método debería devolver la representación de matriz de su objeto.
Se llamará al jsonSerialize
cuando intente utilizar json_encode
en el objeto. Puede pensar en esta interfaz como una especie de "método mágico" específico para la función de codificación JSON nativa, equivalente a __toString
para cadenas.
Poniendo en acción, tiene un objeto que se ve así:
class MyFoo implements JsonSerializable {
public $bar = 'hello';
public $baz = 'world';
public function jsonSerialize() {
return array(
'bar'=>$this->bar,
'baz'=>$this->baz
);
}
}
$myFooInstance= new MyFoo();
echo json_encode($myFooInstance); // {"bar":"hello","baz":"world"}
Cuando yo estoy poniendo en práctica esto en mis proyectos, me suelo poner un método toArray
en los objetos, lo que genera la matriz, y he jsonSerialize
usarlo:
public function jsonSerialize() { return $this->toArray(); }
... de esta manera también puedo hacer uso de la forma array, si así lo desea. Esto también es útil si va a estar implementando la serialización de objetos con __sleep
Documentación
'eval()' es malo. No lo use a menos que no pueda evitarlo, y especialmente no lo use en datos que no sean de confianza. – Bobby
De hecho, eval() es un método peligroso para llamar y, además, si el objeto es bastante grande, puede ser muy lento de procesar. Sería mejor si ignoras su existencia porque en la mayoría de los casos, si necesitas usarlo para su propósito real, es porque tienes un problema de arquitectura. – RPDeshaies
mejor respuesta! funciona como un encanto –