Мне нужна помощь в обновлении класса с помощью устаревшей функции 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;
    }
}

Спасибо за любую помощь.

0
cavameta 26 Июл 2020 в 13:54

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 не рекомендуется . Есть несколько других классов, которые делают это за вас. Попробуйте вместо этого заменить свой класс небольшой математической библиотекой.

1
Jonas Lundman 19 Авг 2020 в 18:47