Php 如何在匿名函数中将$this声明为*use()*参数?

Php 如何在匿名函数中将$this声明为*use()*参数?,php,parameter-passing,Php,Parameter Passing,例如: class foo { private $x=array(); public function foo() { $z = function ($a) use (&$this->x) { ... } } } 错误:无法使用$this作为词法变量 根据情况,我们可以将匿名声明为一种方法。。。因此,另一个问题出现了。我的“真实案例” 错误:未定义的属性$foo…编辑:如果需要从回调中修改私有属性,

例如:

class foo {
    private $x=array();
    public function foo() {
        $z = function ($a) use (&$this->x) {
            ...
        }
    }
}
错误:无法使用$this作为词法变量


根据情况,我们可以将匿名声明为一种方法。。。因此,另一个问题出现了。我的“真实案例”


错误:未定义的属性$foo…

编辑:如果需要从回调中修改私有属性,则回调应该是对象方法,而不是闭包。因此:

preg_replace_callback('/aaaa/', array($this, 'foo'), $str);
其中
foo
是您的方法。但是,如果不需要修改属性,则可以使用闭包作为回调,并将
x
的值赋给
使用的变量


我还应该提到,在PHP5.4中,您可以从闭包中访问
$this

preg_replace_callback('/aaaa/', function($a){
  // $this->x is accessible here
}, $str);
试试这个:

class foo {
    private $x=array();
    public function foo() {
        $v = &$this->x;
        $z = function ($a) use ($v) {
            ...
        }
    }
}

是的,应对,一个不优雅的解决方案。。。没有比PHP更好的“转义语法”了??优雅的解决方案是将
$z
作为一个方法:)是的,将匿名函数作为一个方法是一个好主意。我编辑这个问题是为了让你看到一个新问题。PS:我是否可以编辑你的答案,将指针
$that=&$this->x
添加为Bgdan,并为我的特定问题添加放大的解决方案。。。还是你编辑?(那么我可以接受)这里不需要引用或指针。我已经更新了A。是的,应付一个指针,一个不优雅的解决方案。。。没有比PHP更好的“转义语法”了??它是最健壮的,我相信它的
&
的作用是什么?闭包没有得到引用。您还需要
使用(&$v)
。通过引用将私有属性传递给anon.function打破了基本的OO概念:)那么,您还可以将属性公开
class foo {
    private $x=array();
    public function foo() {
        $v = &$this->x;
        $z = function ($a) use ($v) {
            ...
        }
    }
}