具有动态数量的参数/参数的匿名函数

时间:2018-08-07 10:31:53

标签: php dynamic lambda anonymous-function php-7.2

因此,前段时间,我为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()函数(我不关心安全性,所以可以) ,只是我不确定如何使用动态变量名称添加动态数量的参数。

1 个答案:

答案 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