有什么方法可以使用从 php 到 javascript 的 stdClass 响应匿名函数

Is there any way to response anonymous function with stdClass from php to javascript

以下是我的代码

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

你必须用这个数据结构准备$my_array然后回显

json_encode($my_array);

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

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

当然,您不能使用 json_encode 将 PHP 函数转换为 Javascript 函数,因为 PHP 将不知道转换 [=13] =] 函数的主体到它的 Javascript 对应物中,所以 JSON (当用于在两种编程语言之间传输数据时)意味着传输数据,例如具有一些标量值的对象属性或具有标量值的数组等,但不是代码逻辑(函数)。

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

var_dump($obj)的输出是

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

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

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

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

如果您想在客户端使用某个功能,请查看 是否可以提供帮助。

JSON只能表示数据,不能表示代码。 PHP 的 json_encode 永远不会 return "formatter": function () { ... },因为它无效 JSON.

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

我希望 JSON 无法以 language-independent 方式表达 code

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

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

有可能,但如果你会去做,那说明你真的是个怪人。 根据这个答案 - 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 解析器(有 blackjack 和 whores),解析你的函数和根据你的结果将函数转换为 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 层,而不是使 data-representation 混乱。