【发布时间】:2014-07-12 05:52:33
【问题描述】:
如果你想在一个类中使用闭包,你如何从那个类中传入一个实例变量?
class Example {
private $myVar;
public function test() {
$this->myVar = 5;
$func = function() use ($this->myVar) { echo 'myVar is: ' . $this->myVar; };
// The next line is for example purposes only if you want to run this code.
// $func is actually passed as a callback to a library, so I don't have
// control over the actual call.
$func();
}
}
$e = new Example();
$e->test();
PHP 不喜欢这种语法:
PHP Fatal error: Cannot use $this as lexical variable in example.php on line 5
如果你脱掉$this->那么它就找不到变量了:
PHP Notice: Undefined variable: myVar in example.php on line 5
如果您按照某些地方的建议使用use (xxx as $blah),则无论您是否使用$this,语法似乎都是无效的:
PHP Parse error: syntax error, unexpected 'as' (T_AS), expecting ',' or ')' in example.php on line 5
有没有办法做到这一点?我可以让它工作的唯一方法是使用一个狡猾的解决方法:
$x = $this->myVar;
... function() use ($x) { ...
【问题讨论】:
-
你最后的“解决方法”就是我会怎么做。
-
你为什么认为它很狡猾?正如它所说,您不能将
$this用作词法变量,因此您需要使用另一个变量。这就是$x。 -
这很狡猾,因为它增加了额外的复制操作。我必须将变量复制到
$x,然后将$x第二次复制到闭包中。如果我可以做类似function () use ($this->myVar as $x)这样的事情,那么它将避免额外的复制并使代码更整洁。 -
PHP 使用惰性复制,它最初只使用引用,仅在其中一个被修改时复制。
-
FWIW,PHP 5.4 支持
$this内部闭包。