Laravel匿名函数如何知道它的参数

时间:2017-08-16 09:03:52

标签: php laravel anonymous-function

考虑以下代码:

$fn = FormNilai::whereHas('mataPelajaranLokalGuru',function($mlg) {
      $mlg->where('guru_id','=',$this->uid);
})->get();

$mlg如何始终被视为FormNilai个实例?情景怎么样?我读了很多关于依赖注入的内容,但仍然没有说明问题。

3 个答案:

答案 0 :(得分:1)

我已经意识到laravel支持php匿名风格,所以我们可以实现这样的javascript函数用法,但我第一次肯定很难做到

为简单起见,他们会显示一个这样的例子

$users = User::with(array('posts' => function($query)
{
$query->where('title', 'like', '%first%');
}))->get();

如果用户想要使第三个参数填充变量,该怎么办?当我检查出来并替换那些'%'%%'任何全局变量的单词,都会破坏结构,并且它会发生在我身上。

$title = 'heirlom of marineford';
$users = User::with(array('posts' => function($query)
{
   $query->where('title', 'like', $title);
}))->get();

在搜索PHP文档后,我发现通过使用use()扩展功能块将参数传递给该匿名函数的技术,因此该函数将假定使用use()部分定义的所有变量

$title = 'heirlom of marineford';
$users = User::with(array('posts' => function($query) use($title)
{
    $query->where('title', 'like', $title);
}))->get();

我希望这可以帮到你

答案 1 :(得分:0)

Dependency Injection是另一个角色。根据您的代码示例,您需要告诉匿名函数使用该变量,如...

$uid = $this->uid; 
$fn = FormNilai::whereHas('mataPelajaranLokalGuru',function($mlg) use($uid)
                    {
                        $mlg->where('guru_id','=',$uid);
                    })->get();

由于变量uid超出了匿名函数的范围,因此需要使用use关键字传递,如上面的代码所示。

您可以使用示例here

use上获得更多想法

答案 2 :(得分:0)

参数$mlg未被视为FormNilai个实例,它只被视为Illuminate\Database\Eloquent\Builder的实例。

您可以在源代码中看到它的工作原理。 Illuminate/Database/Eloquent/Builder.php#L934

实施例

定义匿名函数接受常规参数:

$example = function ($arg) {
    var_dump($arg);
};

$example("hello");

您可以将参数名称更改为任何字符串,就像$myArgument一样 并且无论参数名称是什么,输出都不会改变。