在方法内部返回$this的用法



我使用Laravel和eclipse作为我的IDE。我正在使用laravel-ide帮助程序包进行自动完成。

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

当我输入时

User::find

eclipse为我提供了:

find($id,$columns(:\Illuminate\Database\Eloquent\Model。

这意味着"find"方法返回一个\Illuminate\Database\Eloquent\Model实例。

但是,当我输入时

User::where

eclipse为我提供了以下内容:

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

这意味着函数"where"返回

$this

现在,我真的不知道$this是什么意思,因为据我所知,"where"应该返回一个查询生成器实例。据我所知,$this意味着方法的对象调用方(在本文中,是User模型本身(。但它显然没有返回模型。我怀疑我不明白$在这种情况下意味着什么。

我错过了什么?

find()where()方法在Model类上不存在,因此对这些方法的调用最终会落入Laravel定义的PHP魔术方法__call()。在这个神奇的方法中,Laravel将方法调用转发到一个新的查询生成器对象,确实有这些方法。

查询生成器类的find()方法返回一个Model,其where()方法返回对自身的引用($this(,这样您就可以流畅地将更多方法调用链接到生成器。

所有这些都会使IDE很难提供提示(IntelliSense(,而这正是laravel-IDE helper等包的用武之地。它们基本上会生成充满接口的文件,IDE可以使用这些文件来了解各种类的神奇方法和属性,但在某些情况下,这些方法签名仍然达不到您可能想要了解的代码结构。

在这种情况下,IntelliSense建议显然是从IlluminateDatabaseEloquentBuilder::where():的文档块中填充的

/**
* 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可能足够聪明,能够理解其含义并为该类的实例提供建议。然而,如果IDE正在解析的方法定义是由类似laravel-IDE-helper的包生成的,那么这可能会变得更加复杂。在这种情况下,它不仅取决于IDE的功能,还取决于帮助程序包的输出。

Eclipse的提示完全脱离源代码中的方法注释,因此,如果您查看Builder的源代码,它是query()的返回类型,它具有find。。。

/**
* Find a model by its primary key.
*
* @param  mixed  $id
* @param  array  $columns
* @return IlluminateDatabaseEloquentModel|IlluminateDatabaseEloquentCollection|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()中的第一个,即IlluminateDatabaseEloquentModel,而where()中的唯一选项是$this

最新更新