php - PHP 中的 create_function 已弃用
问题描述
<?php
function compute($input){
$compute = create_function('', 'return '.$input.';');
return 0 + $compute();
}
$test = array(
'5 + 5',
'3 +( 2 * 3)',
'(3 + 2) * 3',
'3 + 2 * 3',
'(3-2-1)*3'
);
foreach( $test AS $string){
echo compute( $string);
echo "<br />";
}
http://sandbox.onlinephpfunctions.com/code/61ee53b5477d7450ff89f4f012915a44e609000b
上面的代码在 PHP 7.2 中被弃用了。大多数遇到此问题的其他人被告知使用匿名函数。但在这种情况下,我不知道如何使用它。
解决方案
如果您真的想在整个解决方案中继续使用 PHP,那么一个简单的解析器,也许是递归下降,或者像这样的解析器会很好地完成这项工作。您可以很容易地使用这样的系统来评估自定义公式,而无需求助于 eval。
就个人而言,我想要一些可以安全地评估 php 中的整个函数(使用循环、条件等)的东西,所以我使用了一个非常轻量级的 javascript 解释器,称为 duktape,它可以作为模块编译到 php 7 中。然后,您可以调用它来评估 javascript 函数,这些函数本质上很简单,除了能够返回值并从原始脚本中获取输入外,没有输入/输出功能。
我是这样做的:
/* Execute a javascript function. Requires the duktape extension to be included in PHP.
* Accepts an array of variables by name to include as parameters to the called code.
* The code is expected to return a value, which should be scalar (numeric, string or null).
*/
function jsfunction($inputs, $code)
{
$duktape = new Duktape();
$javascript = "function e() {";
foreach ($inputs as $name=>$value) {
$javascript .= "var " . $name . ' = ' . json_encode((object)$value) . ";\n";
}
$javascript .= $code . "}\ne();";
try {
$result = $duktape->eval($javascript);
}
catch (Exception $e) {
return null;
}
return $result;
}
参数必须作为名称/值对的数组传递,例如传递 ['a'=>42] 使名称为 'a' 的变量对 javascript 可见,值为 42。 $code 包含 javascript 函数体, 周围没有大括号,必须以 return 语句结尾。
希望这可以帮助!
推荐阅读
- c# - 即使包含 System.Core.dll 也无法访问 System.Linq
- c# - 检查 C# 字符串是否是带有端口号的格式正确的 url
- c - 什么是我的 C 代码没有以楼梯模式打印 #,这是来自hackerrank,我没有通过所有测试用例,但我无法指出原因?
- html - 猫头鹰轮播额外空间,同时显示实际图像大小
- javascript - 多条件/多变量 Javascript Switch 语句?
- javascript - 为什么第一个元素和最后一个元素之间的距离会减小?
- python - python - 如何仅对python列表中的“n”个随机元素进行洗牌?
- node.js - 为什么 cookie 没有用 express 设置?
- java - 如何在 IntelliJ IDEA 社区中显示函数的预期参数?
- scala.js - Binding.scala - SBT 内存不足问题