首页 > 解决方案 > 是否可以将对象变量传递给匿名函数中的“使用”部分

问题描述

所以基本上我试图将当前对象变量传递给我的匿名函数,如下所示:

$options = Option::whereHas('texts', function($query) use ($this->language) {
        $query->where(['language_id' => $this->language->id, ]);
    })->where(['active' => 1, ])
    ->get();

但它给出了:

语法错误,意外的 '->' (T_OBJECT_OPERATOR),需要 ',' 或 ')'`。

无论如何,如果我将另一个变量设置为$this->language并将其传递给匿名函数,它将正常工作。

$language = $this->language;
$options = Option::whereHas('texts', function($query) use ($language) {
        $query->where(['language_id' => $language->id, ]);
    })->where(['active' => 1, ])
    ->get();

那么,将对象变量传递给匿名函数中的“使用”部分的正确方法是什么?

标签: phplaravelooplaravel-5php-7

解决方案


文档中:

从 PHP 5.4.0 开始,当在类的上下文中声明时,当前类会自动绑定到它,从而使$this在函数范围内可用。如果不需要当前类的这种自动绑定,则可以使用静态匿名函数。

由于您在类中使用非静态匿名函数,因此$this变量会自动绑定到函数而不需要use它。这应该可以正常访问函数内的语言。

$options = Option::whereHas('texts', function($query) {
    $query->where(['language_id' => $this->language->id]);
})
->where(['active' => 1])
->get();

但是,如果您不想这样做,并且想要use一个变量,则应该将该use语句视为第二组已定义的参数。例如,您不能定义类似function test($this) {}or的函数function test($obj->property) {},因此您的use语句中不能使用该格式。

您需要将您想要对匿名函数可用的任何内容分配给一个变量,然后use是该变量。


推荐阅读