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