以下是我的代码
$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;
}
}
}
答案 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);
});