有没有办法用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重用这段代码。咬我闪亮的金属屁股,这是一个很好的引号.