Итак, некоторое время назад я создал анализатор для плагина 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 () функция для этого (я не беспокоюсь о безопасности здесь, так что все в порядке), просто я не уверен, как добавить динамическое число параметров с именами динамических переменных.
Вы можете пойти с Анонимные функции с этим.
Я использовал 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
Других решений пока нет …