Voici mon code

$obj = new stdClass();
$obj->xAxis = new stdClass();
$obj->xAxis->allowDecimals = false;
$obj->xAxis->labels = new stdClass();
$obj->xAxis->labels->formatter = function() { return this.value; };

return $obj;

Je veux répondre comme json en ajax comme suit

xAxis: {
    allowDecimals: false,
    labels: {
        formatter: function () {
            return this.value;
        }
    }
}
3
Rahul Tank 11 avril 2018 à 12:33

5 réponses

Meilleure réponse

Non. Il n'y a aucun moyen de passer cette fonction en Javascript car non seulement PHP s'exécute côté serveur et Javascript s'exécutera côté client, mais aussi cette fonction sera analysée en objet fonction au moment où vous obtiendrez cet objet $obj .

La sortie de var_dump($obj) est

object (stdClass) # 1 (1) {["xAxis"] => object (stdClass) # 2 (2) {["allowDecimals"] => bool (false) ["labels"] => object (stdClass) # 3 (1) {["formatter"] => objet (fermeture) # 4 (0) {}}}}

Vous pouvez voir que la fonction est analysée dans un objet et que la sortie finale que vous obtiendrez n'aura pas cette fonction du tout. Vous obtiendrez cependant le reste des paramètres et des valeurs.

{"xAxis": {"allowDecimals": false, "labels": {"formatter": {}}}}

En utilisant JSON, vous pouvez passer des clés et des valeurs entre 2 langages de programmation, mais pas des fonctions. Donc, il n'y a qu'une seule option est de créer une fonction associée en Javascript et de l'utiliser pour ce que vous voulez accomplir.

Si vous souhaitez utiliser une fonction côté client, voyez si cette réponse peut vous aider.

1
A J 9 11 avril 2018 à 10:06

C'est possible, mais si vous le faites, cela signifie que vous êtes vraiment une personne bizarre. Selon cette réponse - reconstruire / obtenir le code de la fonction php

Vous pouvez obtenir le code de fonction php sous forme de chaîne quelque chose comme ceci:

$a = function () {
    echo "hello";
};
$func = new ReflectionFunction($a);
$filename = $func->getFileName();
$start_line = $func->getStartLine() - 1; // it's actually - 1, otherwise you wont get the function() block
$end_line = $func->getEndLine();
$length = $end_line - $start_line;

$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
print_r($body);

Après avoir obtenu le code de la fonction sous forme de chaîne, vous pourrez l'envoyer au javascript sous forme de chaîne, écrire votre propre analyseur php (avec blackjack et putes), analyser votre fonction et selon vos résultats transformer la fonction en fonction js, puis utiliser La construction eval fait votre talon bizarre.

Mais si vous regardez votre problème sous un autre angle, vous verrez, que ce n'est pas nécessaire. Le moyen le plus simple est d'utiliser un décorateur ou une façade côté javascript:

    function MyCoolObjectDecorator(data) {
        this.data = data;
    }
    MyCoolObjectDecorator.prototype.formatter = function () {
        return this.data;
    }

[send ajax request].then(function(response) {
    return new MyCoolObjectDecorator(response).
}).then(function(response){
    console.log(response.formatter());
})

En utilisant cette approche, vous utiliserez votre backend en tant que couche de données et votre frontend en tant que couche d'interface utilisateur, au lieu de gâcher la représentation des données.

1
degr 11 avril 2018 à 10:24

JSON ne peut exprimer que des données, pas du code. Il n'y a aucun moyen que json_encode de PHP ne retourne jamais "formatter": function () { ... }, car ce n'est pas du JSON valide.

Plus fondamentalement, function() { return this.value; } n'est pas un code PHP valide. * Si quoi que ce soit, il devrait être function () { return $this->value; }. ** Et puis json_encode devrait savoir le transformer en équivalent Javascript. Mais attendez, JSON n'est pas spécifique à Javascript, vous pouvez également envoyer votre JSON à un service écrit dans n'importe quel autre langage de programmation…

J'espère qu'il est évident qu'il n'y a aucun moyen pour JSON d'exprimer le code d'une manière indépendante de la langue.

* Eh bien, c'est syntaxiquement valide, mais cela ne signifie pas ce que vous voulez que cela signifie.
** Ce qui n'est pas valide car $this est utilisé en dehors d'un contexte de classe, mais ignorons cela pour le moment…

Donc, non, vous ne pouvez pas retourner une définition de fonction en JSON. Vous pouvez bien sûr utiliser echo 'function () { this.value; }'; pour sortir du code Javascript depuis PHP, mais encore une fois, vous voulez garder les choses indépendantes du langage et de l'implémentation et ne renvoyer que les données depuis votre PHP et laisser le code à l'implémentation Javascript spécifique.

0
deceze 11 avril 2018 à 10:14

Bien sûr, vous ne pouvez pas transformer une fonction PHP en fonction Javascript en utilisant json_encode, car PHP n'aura aucune idée pour transformer le corps de la fonction PHP en son équivalent Javascript, donc JSON (lorsqu'il est utilisé pour transférer des données entre 2 langages de programmation ) est destiné à transférer des données, comme des attributs d'objet avec certaines valeurs scalaires ou des tableaux avec des valeurs scalaires et ainsi, mais pas de logique de code (fonctions).

1
ankabot 11 avril 2018 à 09:52

Vous devez préparer $ my_array avec cette structure de données, puis faire écho

json_encode($my_array);

Dans JS, vous pouvez obtenir ces données avec AJAX de cette façon:

$.get('script.php', /* optional get variables*/ function(output) {
  var data = $.parseJSON(output);
});
-1
Shree 11 avril 2018 à 10:38