2011-06-15 11 views
18

Tengo objetos en php que representan un "elemento" y toda la información asociada a él.pasando objetos de PHP a javascript

Y cuando el usuario navega por la página, estos objetos deben pasarse a javascript. Idealmente, reflejando la misma estructura, para que pueda usar Raphael para mostrar cada elemento y su información como formas separadas en mi sitio.

Sin embargo, ¿cómo se obtiene un objeto de php para javascript?

Respuesta

30

Puede convertir el objeto PHP en una matriz, y luego usar la función JSON para codificarlo. Después de eso, decodifícalo desde JavaScript. Aquí hay algunos pasos básicos:

  1. Convert el objeto PHP a una matriz.

  2. Usando json_encode() para codificar esa matriz de PHP.

  3. Pass datos JSON codificados a PHP

  4. decodificación JSON de JavaScript utilizando JSON.parse o puede utilizar jQuery.parseJSON de hacer eso.

Este es un interesante tutorial sobre cómo pasar un JavaScript object to a PHP object. Puede que le resulte útil al ver algunos otros videos destacados/relacionados.

Espero que esto ayude.

+6

'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

+0

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

+0

mejor respuesta! funciona como un encanto –

1

Utilizará JSON para codificar los objetos PHP para que JavaScript pueda acceder a ellos. Los detalles sobre cómo hacerlo dependen de su aplicación.

PHP tiene las funciones json_encode y json_decode para este propósito.

6

Yo uso este:

<script> 
var js_data = '<?php echo json_encode($php_data); ?>'; 
var js_obj_data = JSON.parse(js_data); 
</script> 

$ php_data puede ser desde simples matrices a las matrices de objetos.

13

Ú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

+0

Probablemente la mejor manera de hacerlo. – designcise

Cuestiones relacionadas