是否可以将对象变量传递给匿名函数中的 "use" 部分
Is it possible to pass object variable to "use" section in anonymous function
所以基本上我是想像这样将当前对象变量传递给我的匿名函数:
$options = Option::whereHas('texts', function($query) use ($this->language) {
$query->where(['language_id' => $this->language->id, ]);
})->where(['active' => 1, ])
->get();
但它给出了:
syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ')'`.
无论如何,如果我将另一个变量设置为$this->language
并在匿名函数中传递它,它将正常工作。
$language = $this->language;
$options = Option::whereHas('texts', function($query) use ($language) {
$query->where(['language_id' => $language->id, ]);
})->where(['active' => 1, ])
->get();
那么,将对象变量传递给匿名函数中的 "use" 部分的正确方法是什么?
As of PHP 5.4.0, when declared in the context of a class, the current class is automatically bound to it, making $this available inside of the function's scope. If this automatic binding of the current class is not wanted, then static anonymous functions may be used instead.
由于您在 class 中使用非静态匿名函数,因此 $this
变量会自动绑定到该函数,而无需 use
它。这应该可以很好地访问函数内部的语言。
$options = Option::whereHas('texts', function($query) {
$query->where(['language_id' => $this->language->id]);
})
->where(['active' => 1])
->get();
但是,如果您不想这样做,并且想要 use
一个变量,您应该将 use
语句视为第二组定义的参数。例如,您不能定义像 function test($this) {}
或 function test($obj->property) {}
这样的函数,因此您不能在 use
语句中使用该格式。
您需要将您想要提供给匿名函数的任何内容分配给一个变量,然后 use
该变量。
所以基本上我是想像这样将当前对象变量传递给我的匿名函数:
$options = Option::whereHas('texts', function($query) use ($this->language) {
$query->where(['language_id' => $this->language->id, ]);
})->where(['active' => 1, ])
->get();
但它给出了:
syntax error, unexpected '->' (T_OBJECT_OPERATOR), expecting ',' or ')'`.
无论如何,如果我将另一个变量设置为$this->language
并在匿名函数中传递它,它将正常工作。
$language = $this->language;
$options = Option::whereHas('texts', function($query) use ($language) {
$query->where(['language_id' => $language->id, ]);
})->where(['active' => 1, ])
->get();
那么,将对象变量传递给匿名函数中的 "use" 部分的正确方法是什么?
As of PHP 5.4.0, when declared in the context of a class, the current class is automatically bound to it, making $this available inside of the function's scope. If this automatic binding of the current class is not wanted, then static anonymous functions may be used instead.
由于您在 class 中使用非静态匿名函数,因此 $this
变量会自动绑定到该函数,而无需 use
它。这应该可以很好地访问函数内部的语言。
$options = Option::whereHas('texts', function($query) {
$query->where(['language_id' => $this->language->id]);
})
->where(['active' => 1])
->get();
但是,如果您不想这样做,并且想要 use
一个变量,您应该将 use
语句视为第二组定义的参数。例如,您不能定义像 function test($this) {}
或 function test($obj->property) {}
这样的函数,因此您不能在 use
语句中使用该格式。
您需要将您想要提供给匿名函数的任何内容分配给一个变量,然后 use
该变量。