$this
可以按照您的描述取消设置。
Zend_Framework 1.x 有一个实例,他们在Zend_Service_WindowsAzure_Storage_Batch
课堂上这样做
请注意,这不会取消设置实例,只会取消对函数范围内的实例的引用。
尽管有文档,但这是自 php 5.1.6 以来观察到的行为。
我对为什么 this 不适用于 eval 的唯一猜测是它必须创建一个新的执行上下文,其中 $this 恢复到当前范围。此示例展示了该行为。
class A {
public function test(){
print "Before Unset\n";
print_r($this);
unset($this);
print "After Unset\n";
print_r($this);
print "Evaled\n";
eval("print_r(\$this);");
print "After Eval\n";
print_r($this);
}
}
$a = new A();
$a->test();
其输出为:
Before Unset
A Object
(
)
After Unset
PHP Notice: Undefined variable: this in /home/cgray/q.php on line 9
PHP Stack trace:
PHP 1. {main}() /home/cgray/q.php:0
PHP 2. A->test() /home/cgray/q.php:17
Evaled
A Object
(
)
After Eval
A Object
(
)
您可以避免此问题的一种方法是$this
在评估的上下文中取消设置。
class foo
{
public function method()
{
$code = 'var_dump(isset($this));';
unset($this);
var_dump(isset($this));
eval("unset(\$this);".$code);
}
$foo = new foo;
$foo->method();
更新
似乎include
在函数范围内的文件也将恢复$this