<?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. Большинству других людей, у которых была эта проблема, сказали использовать анонимную функцию. Но в этом случае я понятия не имею, как его использовать.
TNX за помощь мне: /
Вау, какой действительно неэффективный способ написать свою собственную функцию ‘eval ()’. Но полезно для получения стойкости в скомпрометированных системах. Возможно, это является причиной того, что функция устарела?
Если проблему вы пытаетесь решить является ваш тестовый случай, то либо используйте eval (с проверенными входами — /^[^0-9 +-*\/\(\)]$/
) или использовать lib, специально разработанный для разрешения таких выражений.
Если ты не пытаясь реализовать полиморфный код, анонимные функции работают прямо (что по совпадению реализует полиморфный код!):
$compute = function () use ($arg) {
if (preg_match('/^[^0-9 +-*\/\(\)]$/', $arg)) {
return eval('return '.$arg . ';');
}
return false;
};
Простой парсер, возможно, рекурсивный спуск, или как этот сделал бы работу хорошо, если бы вы ДЕЙСТВИТЕЛЬНО хотели продолжать использовать 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.
Надеюсь это поможет!