有什么方法可以使用从 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 混乱。
以下是我的代码
$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 混乱。