Мне нужна помощь в обновлении класса с помощью устаревшей функции create_function (). Может ли кто-нибудь понять конструкцию содержимого моего класса, чтобы заменить его версией 7.2?
Объяснение класса: этот класс работает с вложенными символами данных в строку типа «[(((2 * 4) + 6))]», чтобы выполнить правильные математические вычисления. Пример, конечно, более сложный, чем этот - в этом отношении - я сам не разбираюсь в классе ... Он просто работает так, как ожидалось!
Основная проблема (закрытая функция) находится здесь:
private function compute($input){
$compute = create_function('', 'return '.$input.';');
return 0 + $compute();
}
И называется он 2 раза как:
// Calculate the result
if(preg_match(self::PATTERN, $input, $match)){
return $this->compute($match[0]);
}
Вот полный класс:
class Field_calculate {
const PATTERN = '/(?:\-?\d+(?:\.?\d+)?[\+\-\*\/])+\-?\d+(?:\.?\d+)?/';
const PARENTHESIS_DEPTH = 10;
public function calculate($input){
if(strpos($input, '+') != null || strpos($input, '-') != null || strpos($input, '/') != null || strpos($input, '*') != null){
// Remove white spaces and invalid math chars
$original = $input ;
//$GLOBALS['A_INFO'] .= "Clean input : ".$original." = ".$input."<br/>";
// Validate parenthesis
$nestled = $this->analyse($input);
if(!$nestled){
$GLOBALS['A_INFO'] .= "_x_Parentheses in ".$original." NOT NESTLED CORRECTLY<br/>";
}
$input = str_replace(',', '.', $input);
$input = preg_replace('/[^0-9\.\+\-\*\/\(\)]/', '', $input);
if($input[0] == '(' && $input[strlen($input) - 1] == ')') {
$input = substr($input, 1, -1);
}
// Calculate each of the parenthesis from the top
$i = 0;
while(strpos($input, '(') || strpos($input, ')')){
$input = preg_replace_callback('/\(([^\(\)]+)\)/', 'self::callback', $input);
$i++;
if($i > self::PARENTHESIS_DEPTH){
break;
}
}
// Calculate the result
if(preg_match(self::PATTERN, $input, $match)){
return $this->compute($match[0]);
}
return 0;
}
return $input;
}
private function analyse($input){
$depth = 0;
for ($i = 0; $i < strlen($input); $i++) {
$depth += $input[$i] == '(';
$depth -= $input[$i] == ')';
if ($depth < 0) break;
}
if ($depth != 0) return false;
else return true;
}
private function compute($input){
$compute = create_function('', 'return '.$input.';');
return 0 + $compute();
}
private function callback($input){
if(is_numeric($input[1])){
return $input[1];
}
elseif(preg_match(self::PATTERN, $input[1], $match)){
return $this->compute($match[0]);
}
return 0;
}
}
Спасибо за любую помощь.
1 ответ
Этот класс возвращает математические результаты из строки. Здесь вы можете найти свой класс и те же проблемы: вычислить математическое выражение из строки используя eval
Сначала он удаляет нематематические материалы, «[(((2 * 4) + 6))]» становится «((2 * 4) + 6)», и в конце чистые результаты = 14. Вместо удаления числовые значения, используя функцию, чтобы подделать "eval" строку как php-код. Поскольку смешивание переменных удаляется в php v.7.2, этот обходной путь недействителен.
Это делается путем добавления числовой переменной к результатам вычисления функции:
return 0 + $compute();
Это можно сделать так:
$value = eval("return ($input);");
return $value;
Или заполнить:
private function compute($input){
$returnvalue = eval("return ($input);");
return $returnvalue;
}
Это исправляет ошибку yout php 7.2. Но использовать eval не рекомендуется . Есть несколько других классов, которые делают это за вас. Попробуйте вместо этого заменить свой класс небольшой математической библиотекой.
Похожие вопросы
Связанные вопросы
Новые вопросы
callback
Обратный вызов - это фрагмент кода (то есть адрес или ссылка на функцию или метод или лямбда-выражение), который передается в качестве аргумента другому коду, который должен вызывать (выполнять) аргумент в удобное время. Этот тег следует использовать с вопросами об API, который использует обратные вызовы для уведомления вызывающей стороны о завершении действия. Используйте тег обработки событий для вопросов, связанных с подпиской на события, например в рамках графического интерфейса.