一尘不染

什么时候在php中是邪恶的?

php

在我用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')";

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

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

阅读 360

收藏
2020-05-26

共1个答案

一尘不染

在将eval()称为纯邪恶时,我会保持谨慎。 动态评估是一个强大的工具,有时可以节省生命。使用eval()可以解决PHP的缺点(请参见下文)。

eval()的主要问题是:

  • 潜在的不安全输入。 传递不受信任的参数是一种失败的方法。确保参数(或其一部分)受到完全信任通常不是一件容易的事。
  • 整。 使用eval()使代码更聪明,因此更难遵循。用布莱恩·科尼根(Brian Kernighan)的话说:“ 调试是一开始编写代码的两倍。因此,如果您尽可能聪明地编写代码,就定义而言,您不够聪明,无法对其进行调试

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

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

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

  1. 有时eval()是唯一/正确的解决方案。
  2. 在大多数情况下,应该尝试其他方法。
  3. 如果不确定,请转到2。
  4. 否则,请 非常非常小心。
2020-05-26