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

有没有办法用stdClass从php响应匿名函数到javascript,javascript,php,json,stdclass,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

下面是我的代码

$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_数组,然后返回

json_encode($my_array);
在JS中,您可以通过以下方式使用AJAX获取此数据:

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

当然,您不能使用
json\u encode
将PHP函数转换为Javascript函数,因为PHP没有线索将PHP函数体转换为Javascript对应体,所以json(用于在两种编程语言之间传输数据)是用来传输数据的,类似于具有一些标量值的对象属性或具有标量值的数组等,但不包括代码逻辑(函数)。

否。无法在Javascript中传递该函数,因为不仅PHP在服务器端运行,Javascript也将在客户端运行,但当您获得该对象时,该函数也将被解析为函数对象

var\u dump($obj)
的输出为

对象(标准类)#1(1){ [“xAxis”]=> 对象(标准类)#2(2){ [“allowDecimals”]=> 布尔(假) [“标签”]=> 对象(标准类)#3(1){ [“格式化程序”]=> 对象(闭包)#4(0){ } } } }

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

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

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


如果您想在客户端使用函数,请查看是否有帮助。

JSON只能表示数据,不能表示代码。PHP的
json_encode
不可能返回
“formatter”:function(){…}
,因为它不是有效的json

更重要的是,
function(){return this.value;}
不是有效的PHP代码。*如果必须是
function(){return$this->value;}
**然后
json\u encode
必须知道如何将其转换为Javascript等价物。但是等等,JSON不是Javascript特有的,您也可以将JSON发送到用任何其他编程语言编写的服务

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

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


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

这是可能的,但如果您愿意这样做,这将意味着您真的是一个古怪的人。 根据这项答覆—

您可以将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端使用decorator或facade:

    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层,而不是将数据表示搞得一团糟。

这将不起作用,OP代码中的匿名函数将由php解析,因此它不会出现在
数据中。
。这就是我编写的原因“必须使用此数据结构准备$my_数组,然后进行echo”。JSON不支持将方法/函数作为有效属性值。不,该函数未被执行。
object(闭包)
是函数对象本身,而不是它的返回值。哦,没有正确地看到
var_dump
输出。但最终,函数将无法工作。非常感谢,我从您的参考中了解到了这一点。我编写了json解析器脚本。json.parse(val,function(k,v){if(typeof v==“string”&&v.indexOf(“function(“)!=-1)返回eval(“(“+v+”)”);否则返回v;})另外,如果你仔细看看你的例子,你在php内部使用js语法。所以,很难理解-你是忘记写引号了,还是写了无效的语法。如果你在php代码内部写js,你可以在js端用
eval
construction重用这段代码。咬我闪亮的金属屁股,这是一个很好的引号.