Анонимная функция с динамическим числом аргументов / параметров

Итак, некоторое время назад я создал анализатор для плагина 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, но этот конструктор в PHP устарел с версии 7.2.0.

Моя проблема сейчас в том, что мне нужно иметь возможность создавать анонимную функцию с динамическим числом параметров, и эти параметры должны иметь имена динамических переменных. Вот мой предыдущий код

protected function createFunction($formula, &$data)
{
$args = '';

foreach($data as $key => $value) {
$args .= '$' . $key . ', ';
}

return create_function(substr($args, 0, strlen($args) - 2), $formula);
}

Как видите, формула $ — это динамический PHP-код, который я написал выше, а $ data — это ассоциативный массив (обычно строка из базы данных). Есть идеи?

Редактировать: Забыл упомянуть, сама формула не проблема, так как я могу просто использовать Eval () функция для этого (я не беспокоюсь о безопасности здесь, так что все в порядке), просто я не уверен, как добавить динамическое число параметров с именами динамических переменных.

0

Решение

Вы можете пойти с Анонимные функции с этим.

Я использовал 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector