为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以将对象变量传递给匿名函数中的“使用”部分

是否可以将对象变量传递给匿名函数中的“使用”部分

PHP
蝴蝶不菲 2021-11-26 15:12:04
所以基本上我试图将当前对象变量传递给我的匿名函数,如下所示:$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();那么,将对象变量传递给匿名函数中的“使用”部分的正确方法是什么?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

从文档:


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


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信