在我用PHP开发的这些年里,我一直听说使用eval()是邪恶的.

考虑到下面的代码,使用第二个(更优雅的)选项是否有意义?如果没有,原因是什么?

// $type is the result of an SQL statement, e.g.
// SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string.

$type = "enum('a','b','c')";

// option one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// option two
eval('$result = '.preg_replace('#^enum#','array', $type).';');

推荐答案

I would be cautious in calling eval() pure evil.动态判断是一个强大的工具,有时可以挽救生命.使用eval()可以解决PHP的缺点(见下文).

eval()的主要问题包括:

  • Potential unsafe input.传递不受信任的参数是失败的一种方式.确保参数(或其一部分)完全可信通常不是一项简单的任务.
  • Trickiness.使用eval()使代码更聪明,因此更难理解.引用Brian Kernighan的"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it"

实际使用eval()的主要问题只有一个:

  • 没有经验的开发人员在没有充分考虑的情况下使用它.

根据经验,我倾向于遵循以下原则:

  1. 有时eval()是唯一/正确的解决方案.
  2. 在大多数情况下,人们应该try 其他方法.
  3. 如果不确定,转到2.
  4. 否则,be very, very careful.

Php相关问答推荐

数组洗牌和undo撤消

使用正则表达式匹配整个句子后如何匹配一些单词?

如何隐藏表格行?

在 WooCommerce 中添加最低订单价格,但仍然允许客户在不满足条件时通过收取赤字来结账

在两个不同的容器中运行 Nginx + PHP-FPM 时,该配置是否可以在不共享代码卷的情况下工作?

如何在php中使用array_map按单词排序

如何在 Gitlab CICD 中运行后台任务?

为 Blade 中的本地日期时间输入字段设置默认值

在 WooCommerce 中获取客户最后一个订单的产品

PHP Carbon 不计算时差

htaccess 重写 url 以便仅在根目录而不是子目录中删除 php 扩展

Visual Studio Code PHP Intelephense 不断显示不必要的错误

将 POSTMAN 请求转换为 Curl

获取初始运行脚本的绝对路径

Laravel 更新后抛出“ bootstrap /缓存目录必须存在且可写”错误

mcrypt 已弃用,有什么替代方案?

如何在 Laravel 模型上设置属性的默认值

使用 Carbon 和 Blade 计算两个日期之间的差异

laravel 5.3 新的 Auth::routes()

PHP 7 中属性的类型提示?