gpt4 book ai didi

PHP eval 和捕获错误(尽可能多)

转载 作者:IT王子 更新时间:2023-10-28 23:47:25 24 4
gpt4 key购买 nike

免责声明;我完全了解 eval 的陷阱和“弊端”,包括但不限于:性能问题、安全性、可移植性等。

问题

阅读关于 eval 的 PHP 手册...

eval() returns NULL unless return is called in the evaluated code, in which case the value passed to return is returned. If there is a parse error in the evaluated code, eval() returns FALSE and execution of the following code continues normally. It is not possible to catch a parse error in eval() using set_error_handler().

简而言之,除了返回 false 之外没有错误捕获,这非常有帮助,但我确信我可以做得更好!

原因

我正在处理的部分网站功能依赖于执行表达式。我不想通过沙箱或执行模块的路径,所以我已经结束使用 eval。在你大喊“如果客户变坏了怎么办?!”之前知道客户非常值得信赖;他不想破坏自己的站点,任何能够访问此功能的人都几乎拥有服务器,无论 eval 是什么。

客户了解 Excel 中的表达式,解释细微差异不是问题,但是,具有某种形式的警告几乎是标准功能。

这是我目前所拥有的:

define('CR',chr(13));
define('LF',chr(10));

function test($cond=''){
$cond=trim($cond);
if($cond=='')return 'Success (condition was empty).'; $result=false;
$cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
try {
$success=eval($cond);
if($success===false)return 'Error: could not run expression.';
return 'Success (condition return '.($result?'true':'false').').';
}catch(Exception $e){
return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
}
}

注意事项

  • 该函数在任何事件中返回一个消息字符串
  • 代码表达式应该是单行PHP,没有PHP标签,没有结束分号
  • 新行转换为空格
  • 添加一个变量来包含结果(表达式应该返回 true 或 false,并且为了不与 eval 的返回冲突,使用了一个临时变量。)

那么,您会添加什么来进一步帮助用户?是否有任何进一步的解析函数可以更好地查明可能的错误/问题?

克里斯。

最佳答案

因为 PHP 7 eval() 将生成一个 ParseError语法错误异常:

try {
$result = eval($code);
} catch (ParseError $e) {
// Report error somehow
}

在 PHP 5 中,eval() 将生成一个解析错误,这是一种特殊情况,不会中止执行(解析错误通常会这样做)。但是,它也不能通过错误处理程序捕获。一种可能性是捕获打印的错误消息,假设 display_errors=1:

ob_start();
$result = eval($code);
if ('' !== $error = ob_get_clean()) {
// Report error somehow
}

关于PHP eval 和捕获错误(尽可能多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com