在方法中使用返回$ this的用法

时间:2018-11-18 14:25:04

标签: php eclipse laravel laravel-5 autocomplete

我正在使用Laravel和eclipse作为我的IDE。我正在使用laravel-ide-helper软件包进行自动补全。

我正在从一个雄辩的模型对象中调用方法。

当我输入

User::find

eclipse为我提供了:

发现($ id,$ columns):\ Illuminate \ Database \ Eloquent \ Model。

这意味着“查找”方法返回一个\ Illuminate \ Database \ Eloquent \ Model实例。

但是,当我输入

User::where

eclipse为我提供了以下内容:

where($column, $operator, $value, $boolean) : $this

这意味着函数“ where”返回

$this

现在,我真的不知道$这意味着什么,因为据我了解,“ where”应该返回查询生成器实例。据我所知,$ this表示方法的对象调用者(在此上下文中,User模型本身)。但这显然不会返回模型。我怀疑在这种情况下我不理解$这意味着什么。

我想念什么?

2 个答案:

答案 0 :(得分:2)

Model类上没有find()where()方法,因此对这些方法的调用最终落入了PHP魔术方法__call() Laravel 已经定义的。在此魔术方法内部,Laravel将方法调用转发到新的查询构建器对象,该对象 具有这些方法。

查询构建器类的find()方法返回模型,而其where()方法返回对自身的引用($ this),以便您可以流畅地将更多方法调用链接到构建器。

所有这些都会使IDE很难提供提示(IntelliSense),这是laravel-ide-helper之类的程序包的进入位置。它们基本上生成充满接口的文件,您的IDE可以使用这些接口来了解什么魔术方法。和属性存在于各种类中,但是在某些情况下,这些方法签名仍未达到您可能希望了解的代码结构。

在这种情况下,显然\Illuminate\Database\Eloquent\Builder::where()的文档块中出现了IntelliSense建议:

/**
 * Add a basic where clause to the query.
 *
 * @param  string|array|\Closure  $column
 * @param  mixed   $operator
 * @param  mixed   $value
 * @param  string  $boolean
 * @return $this
 */
public function where($column, $operator = null, $value = null, $boolean = 'and');

您可以看到返回类型定义为$this。此时,某些IDE可能足够聪明,足以理解其含义并为该类的实例提供建议。但是,如果由laravel-ide-helper之类的包生成IDE解析的方法定义,则情况可能变得更加复杂。在这种情况下,它不仅取决于您的IDE的功能,还取决于帮助程序包的输出。

答案 1 :(得分:1)

Eclipse完全不使用源代码中的方法注释来获取提示,因此,如果您查看query()的返回类型Builder的源代码,则它具有{{1 }} ...

find

/** * Find a model by its primary key. * * @param mixed $id * @param array $columns * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|null */ public function find($id, $columns = ['*']) 是...

where()

由于它只能添加一个类型提示,因此它使用/** * Add a basic where clause to the query. * * @param string|\Closure $column * @param string $operator * @param mixed $value * @param string $boolean * @return $this */ public function where($column, $operator = null, $value = null, $boolean = 'and') { 中的第一个类型提示find(),而\Illuminate\Database\Eloquent\Model中的唯一选项是where()