perso j'utilise la méthode de MaXiMa mais avec un détail supplémentaire : une fonction "php2js" maison.
1. Je crée mon résultat PHP
2. Je renvoie php2js($resultat)
3. Je fais un eval(xhr.responseText)
4. Le résultat est un objet strictement équivalent à ce que j'avais côté PHP
Exemple :
La fonction php2js n'est pas bien méchante, quelque chose de ce genre convient parfaitement :
1. Je crée mon résultat PHP
2. Je renvoie php2js($resultat)
3. Je fais un eval(xhr.responseText)
4. Le résultat est un objet strictement équivalent à ce que j'avais côté PHP
Exemple :
Code :
// 1.
$resultat = new Objet;
$resultat->nom = 'youhou';
$resultat->data = array('abc', 'def');
$resultat->i = 24;
// 2.
echo php2js($resultat);
// 3.
var res = eval('return ' + xhr.responseText);
// 4.
alert(res.nom); // "youhou"
alert(res.data[1]); // "def"
La fonction php2js n'est pas bien méchante, quelque chose de ce genre convient parfaitement :
Code PHP :
<?php
function php2js ($var) {
switch (true) {
// Tableau
case is_array($var):
if (!count($var)) {
// Tableau vide
$res = '[]';
} elseif (array_keys($var) === range(0, count($var)-1)) {
// Tableau simple
$res = '[' . implode(',', array_map('php2js', $var)) . ']';
} else {
// Tableau associatif non vide
$res = '{';
foreach ($var as $key => $val) {
$res .= '"' . addslashes($key) . '":' . php2js($val) . ',';
}
$res = substr($res, 0, -1) . '}';
}
return $res;
// Booléen
case is_bool($var):
return $var ? 'true' : 'false';
// Nombre
case is_int($var):
case is_integer($var):
case is_double($var):
case is_float($var):
return strval($var);
// Chaine de caractères
case is_string($var):
return '"' . addslashes($var) . '"';
// Objet
case is_object($var):
$vars = get_object_vars($var);
if (!count($vars)) {
return '{}';
} else {
return php2js($vars);
}
// NULL
case is_null($var):
return 'null';
// Autre ?
default:
return php2js(strval($var));
}
}