PHP:如何将实例变量传递给闭包?

时间:2014-05-23 01:16:21

标签: php closures

如果要在类中使用闭包,如何从该类传递实例变量?

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) { ...

3 个答案:

答案 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();