因此,前段时间,我为jQuery Query Builder插件构建了一个解析器,该解析器将公式解析为PHP代码,并根据添加的参数返回一些计算结果,范围可能从return $a + $b;
到类似
if($a == 'some_value' || $c == 'other_value') {
return $something;
} else if($b == 'something' && $d == 'anything') {
return $something_else;
} else {
return $anything;
}
,可能会更加复杂。关键是它将其创建为字符串,然后将其传递给另一个函数,该函数返回使用create_function创建的动态函数,但是从7.2.0版开始不赞成使用PHP中的构造函数。
我现在的问题是我需要能够使用动态数量的参数创建匿名函数,并且这些参数需要具有动态变量名。这是我以前的代码
protected function createFunction($formula, &$data)
{
$args = '';
foreach($data as $key => $value) {
$args .= '$' . $key . ', ';
}
return create_function(substr($args, 0, strlen($args) - 2), $formula);
}
如您所见,$ formula是我上面编写的动态PHP代码,而$ data是关联数组(通常是数据库中的一行)。有什么想法吗?
编辑:忘了说了,公式本身不是问题,因为我可以使用eval()函数(我不关心安全性,所以可以) ,只是我不确定如何使用动态变量名称添加动态数量的参数。
答案 0 :(得分:1)
您可以与此配合使用Anonymous functions。
由于您的评论,我在这种情况下使用了eval:
编辑:忘了提,公式本身不是问题,正如我 可以为此使用eval()函数(我不关心安全性 在这里就可以了)
class Foo
{
public function createFunction($formula, $args)
{
$func = function ($args) use ($formula) {
foreach ($args as $key => $val) {
$$key = $val;
}
return eval($formula);
};
return $func($args);
}
}
$foo = new Foo;
$foo->createFunction('echo $a + $b;', ['a' => 1, 'b' => 2]);
您的代码的实时示例 https://3v4l.org/HrMKN