如果要在类中使用闭包,如何从该类传递实例变量?
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) { ...
答案 0 :(得分:7)
如果您使用的是PHP 5.4或更高版本,那么您可以直接在闭包内使用$this
:
$func = function() {
echo 'myVar is: ' . $this->myVar;
};
答案 1 :(得分:6)
您可以使用解决方法。你也可以更一般:
$self = $this;
$func = function() use ($self) {
echo "myVar = " . $self->myVar;
};
在闭包中,您可以使用$self
代替$this
访问任何公共属性或方法。
但它对原始问题不起作用,因为有问题的变量是私有的。
答案 2 :(得分:2)
为什么不呢?:
$func = function($param){ echo 'myVar is: ' . $param; };
$func($this->myVar);
<强>更新强>:
@Bramar对。但是,如果只有$ myVar为public
,它就会起作用。闭包没有关联的范围,因此无法访问私有和受保护的成员。在具体情况下,您可以这样做:
$this->myVar = 5;
$_var = $this->myVar;
$func = function() use ($_var) { echo 'myVar is: ' . $_var; };
$func();