- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
免责声明;我完全了解 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 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/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!