3 回答
TA贡献1821条经验 获得超6个赞
主要的问题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
实际上,generate方法中发生了很多事情。用外行术语来说:PHPUnit将使用参数generate并从中创建一个类模板。然后eval它将使用该类模板使其可用于实例化。这样做的重点是让TestDoubles当然可以模拟UnitTests中的依赖项。
TA贡献1858条经验 获得超8个赞
您可以使用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;
}
}");
}
}
尽管当然使用非常有限(某些API或DI容器,测试框架,必须处理具有动态结构的数据库的ORM,代码游乐场)
- 3 回答
- 0 关注
- 391 浏览
添加回答
举报