是否可以将对象变量传递给匿名函数中的 "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" 部分的正确方法是什么?

来自documentation:

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 该变量。