如何从eval范围中删除$ this?

sec*_*tus 3 php eval

我正在编写简单的模板引擎和带有问题的堆栈:$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价值?

Bli*_*itZ 5

我建议创建unbound closure,$this无法访问或可能被替换.

注意:

  1. Closure自PHP 5.3.0以来,s是可用的,如@ invisal所述.
  2. Closure::bindTo 自PHP 5.4.0起可用.
  3. 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)