我正在编写简单的模板引擎和带有问题的堆栈:$this即使在取消配置后也会进入eval范围.
class foo
{
public function method()
{
$code = 'var_dump(isset($this));';
unset($this);
var_dump(isset($this)); // produce: boolean false
eval($code); // produce: boolean true
}
}
$foo = new foo;
$foo ->method();
Run Code Online (Sandbox Code Playgroud)
如何避免这种没有修改$code价值?
我建议创建unbound closure,$this无法访问或可能被替换.
注意:
Closure自PHP 5.3.0以来,s是可用的,如@ invisal所述.Closure::bindTo 自PHP 5.4.0起可用.Anonymous functions在PHP 5.3.0中不应继承$this执行上下文.它从PHP 5.4.0开始启用.只需$evUl = $evUl->bindTo(null);从下面的示例中删除PHP 5.3.0,它将按预期工作.例:
<?php
header('Content-Type: text/plain');
class foo {
public function method() {
$code = 'var_dump(isset($this));';
$evUl = function()use($code){ eval($code); };
$evUl = $evUl->bindTo(null);
$evUl();
}
}
$foo = new foo();
$foo->method();
?>
Run Code Online (Sandbox Code Playgroud)
显示:
bool(false)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |