PHP 评估和捕获错误(尽可能多)
免责声明;我完全了解eval的陷阱和“邪恶”,包括但不限于:性能问题,安全性,可移植性等。
问题
阅读 PHP 手册上的评估...
eval() 返回 NULL,除非在计算的代码中调用 return,在这种情况下,将返回传递给 return 的值。如果计算的代码中存在解析错误,eval() 将返回 FALSE,并且以下代码的执行将继续正常进行。使用set_error_handler() 无法在 eval() 中捕获解析错误。
简而言之,除了返回false之外,没有错误捕获,这是非常有帮助的,但我是sur eI可以做得更好!
原因
我正在处理的站点功能的一部分依赖于执行表达式。我不想通过沙盒或执行模块的路径,所以我已经结束了使用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 的返回冲突,使用 temp 变量。
那么,你会添加什么来进一步帮助用户?是否有任何进一步的解析函数可以更好地查明可能的错误/问题?
克里斯。