有没有办法用stdClass从php到javascript响应匿名函数

时间:2018-04-11 09:33:06

标签: javascript php json stdclass

以下是我的代码

$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;

我想在ajax中作为json响应,如下所示

xAxis: {
    allowDecimals: false,
    labels: {
        formatter: function () {
            return this.value;
        }
    }
}

5 个答案:

答案 0 :(得分:1)

当然,您无法使用json_encode将PHP函数转换为Javascript函数,因为PHP无法将PHP函数体转换为Javascript函数,因此JSON(用于在之间传输数据) 2种编程语言)用于传输数据,如带有一些标量值的对象属性或带有标量值的数组等,但不是代码逻辑(函数)。

答案 1 :(得分:1)

没有。没有办法在Javascript中传递该函数,因为不仅PHP在服务器端运行而且Javascript将在客户端运行,而且当你获得该对象$obj时,该函数将被解析为函数对象。 / p>

var_dump($obj)的输出是

  

object(stdClass)#1(1){     [ “x轴”] =>     object(stdClass)#2(2){       [ “allowDecimals”] =>       布尔(假)       [ “标签”] =>       object(stdClass)#3(1){         [ “格式化器”] =>         对象(关闭)#4(0){         }       }     }   }

您可以看到该函数被解析为一个对象,您可能获得的最终输出根本就没有该函数。不过,你会得到其余的参数和值。

  

{“xAxis”:{“allowDecimals”:false,“labels”:{“formatter”:{}}}}

使用JSON,您可以在两种编程语言之间传递键和值,但不能传递函数。因此,只有一个选项是在Javascript中创建一个相关的函数,并将其用于您想要完成的任务。

如果您想在客户端使用某项功能,请参阅this answer是否有帮助。

答案 2 :(得分:1)

这是可能的,但如果你这样做,那就意味着你真的很奇怪。 根据这个答案 - reconstruct/get code of php function

你可能会得到像这样的字符串的php函数代码:

$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);

在您将函数代码作为字符串后,您将能够将其作为字符串发送到javascript,编写您自己的php解析器(带有二十一点和妓女),解析您的函数并根据您的结果将函数转换为js函数,然后使用eval构造做你奇怪的存根。

但如果你从其他角度看待你的问题,你会发现,没有必要这样做。最简单的方法是在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());
})

使用这种方法,您将后端用作数据层,将前端用作UI层,而不是使数据表示混乱。

答案 3 :(得分:0)

JSON只能表达数据,而不能表示代码。 PHP的json_encode无法返回"formatter": function () { ... },因为它不是有效的JSON。

更基本的是,function() { return this.value; }不是有效的PHP代码。*如果有的话,它必须是function () { return $this->value; }。**然后json_encode必须知道将其转换为Javascript当量。但是等等,JSON不是特定于Javascript,你也可以将你的JSON发送到用任何其他编程语言编写的服务......

我希望很明显,JSON无法以独立于语言的方式表达代码

*嗯,它在语法上是有效的,但它并不意味着你想要的意思。
**这是无效的,因为$this在类上下文之外使用,但让我们暂时忽略它......

所以,不,你不能在JSON中返回一个函数定义。您当然可以使用echo 'function () { this.value; }';从PHP输出Javascript代码,但同样,您希望保持语言和实现独立并且只返回PHP中的数据并将代码留给特定的Javascript实现。

答案 4 :(得分:-1)

您必须使用此数据结构准备$ my_array,然后使用echo

json_encode($my_array);

在JS中,您可以通过这种方式使用AJAX获取此数据:

$.get('script.php', /* optional get variables*/ function(output) {
  var data = $.parseJSON(output);
});