tyl*_*erl 18
如果您正在编写恶意软件,并且您希望为那些试图在您之后进行清理的系统管理员努力工作.这似乎是我经验中最常见的用例.
Rus*_*ias 17
Eric Lippert总结了三篇博文.这是一个非常有趣的阅读.
据我所知,以下是使用eval的一些唯一原因.
例如,当您根据用户输入构建复杂的数学表达式时,或者将对象状态序列化为字符串以便可以存储或传输它,并在以后重构时.
主要问题eval是它是恶意代码的网关.因此,您永远不应该在可以从外部利用它的上下文中使用它,例如用户提供的输入.
一个有效的UseCase将在Mocking Frameworks中.
例子来自 PHPUnit_Framework_TestCase::getMock()
// ... some code before
$mock = PHPUnit_Framework_MockObject_Generator::generate(
$originalClassName,
$methods,
$mockClassName,
$callOriginalClone,
$callAutoload
);
if (!class_exists($mock['mockClassName'], FALSE)) {
eval($mock['code']);
}
// ... some code after
Run Code Online (Sandbox Code Playgroud)
实际上,generate方法中发生了很多事情.在外行术语中:PHPUnit将接受参数generate并从中创建一个类模板.然后eval,该类模板将使其可用于实例化.这一点的关键是让TestDoubles在UnitTests中模拟依赖关系.
您可以使用eval创建临时类:
function myAutoLoad($sClassName){
# classic part
if (file_exists($sClassName.'.php'){
require $sClassName.'.php';
} else {
eval("
class $sClassName{
public function __call($sMethod,$aArgs){
return 'No such class: ' . $sClassName;
}
}");
}
}
Run Code Online (Sandbox Code Playgroud)
虽然,当然,使用非常有限(一些API或者可能是DI容器,测试框架,ORM必须处理具有动态结构的数据库,代码游乐场)