需要帮助在回调函数中使用已弃用的 create_function() 更新小的 class
Need help to update a small class using deprecated create_function() within a callback function
我需要帮助来使用已弃用的 create_function() 更新 class。有人能看懂我class内容中的构造来替换成7.2版本吗?
Class 解释说: 这个 class 正在处理字符串中嵌套的数据字符,例如 "[(((2 * 4) + 6)) ]”删除正确的数学计算。这个例子当然比那个更复杂 - 在那个问题上 - 我自己不理解 class ...它只是按预期工作!
主要问题(私有函数)是这里:
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:
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;
}
}
感谢您的帮助。
此 class 从字符串返回数学结果。您可以在这里找到您的 class 和同样的问题:calculate math expression from a string using eval
先去掉non-math个素材,“[(((2 * 4) + 6))]”变成“((2 * 4) + 6)”,最后就是纯结果= 14. 它没有剥离数值,而是使用函数 将字符串“eval” 伪造为 php-code。由于 php v.7.2 删除了混合变量,因此此解决方法无效。
这是通过将数值变量添加到函数计算结果来完成的:
return 0 + $compute();
可以这样做:
$value = eval("return ($input);");
return $value;
或完成:
private function compute($input){
$returnvalue = eval("return ($input);");
return $returnvalue;
}
这修复了 php 7.2 错误。 但不推荐使用 eval。还有一些其他 classes 在那里为你做这件事。尝试用一个小的数学库代替你的class。
我需要帮助来使用已弃用的 create_function() 更新 class。有人能看懂我class内容中的构造来替换成7.2版本吗?
Class 解释说: 这个 class 正在处理字符串中嵌套的数据字符,例如 "[(((2 * 4) + 6)) ]”删除正确的数学计算。这个例子当然比那个更复杂 - 在那个问题上 - 我自己不理解 class ...它只是按预期工作!
主要问题(私有函数)是这里:
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:
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;
}
}
感谢您的帮助。
此 class 从字符串返回数学结果。您可以在这里找到您的 class 和同样的问题:calculate math expression from a string using eval
先去掉non-math个素材,“[(((2 * 4) + 6))]”变成“((2 * 4) + 6)”,最后就是纯结果= 14. 它没有剥离数值,而是使用函数 将字符串“eval” 伪造为 php-code。由于 php v.7.2 删除了混合变量,因此此解决方法无效。
这是通过将数值变量添加到函数计算结果来完成的:
return 0 + $compute();
可以这样做:
$value = eval("return ($input);");
return $value;
或完成:
private function compute($input){
$returnvalue = eval("return ($input);");
return $returnvalue;
}
这修复了 php 7.2 错误。 但不推荐使用 eval。还有一些其他 classes 在那里为你做这件事。尝试用一个小的数学库代替你的class。