在PHP / Laravel中,给定“返回$ this-> belongsTo(Model :: class);”,“ Model :: class”的正确术语是什么?

时间:2019-08-23 19:03:59

标签: php laravel-5

在此示例代码中:

public function user()
{
    return $this->belongsTo(User::class);
}

public function sandwich()
{
    return $this->belongsTo(Sandwich::class);
}

我想知道User::class是什么,因为您也可以像上面这样写上面的例子:

public function user()
{
    return $this->belongsTo(\App\User);
}

public function sandwich()
{
    return $this->belongsTo(\App\Sandwich);
}

所以我喜欢Laravel在使用该语法糖时“只知道”模型在哪里,但是它叫什么呢?我想阅读一些有关它的文档,以便我更好地了解幕后发生的事情。

它以某种方式使我想起“路由模型绑定”,所以我想要的答案是某个地方的相关文档页面的链接,或者一个我可以让Google理解那里到底发生了什么的术语。

3 个答案:

答案 0 :(得分:4)

::class的语法为class name resolution。该语法返回完全限定的类名的字符串表示形式,包括所有省略的名称空间信息。

此功能的几个优点是:1.无需显式指定类的完全限定名称空间,以及2.能够将完全限定名称空间作为字符串传递,同时允许IDE定位类。重构或搜索引用时的名称。

答案 1 :(得分:3)

  

我想知道什么叫User :: class

一个俗称的名字是类名解析。它结合了PHP解析运算符::class关键字。它不是Laravel语法糖,而是PHP。

在所有情况下,它返回类的完全限定名称,该名称只是一个字符串,其中包含类文件的绝对/相对路径-取决于使用该文件/类的名称空间。

PHP Manual

  

...使用ClassName :: class获得ClassName的完全限定名称

另一方面,在您提到的Laravel用例中

public function user()
{
    return $this->belongsTo(User::class);
}

Laravel Eloquent方法belongsTo()和所有类似方法均指定要传递的参数是字符串。这些方法解析字符串参数以定位模型的类定义。

Laravel Docs

  

传递给hasOne方法的第一个参数是相关模型的名称。

因此使用

return $this->belongsTo('\App\User');

OR

return $this->belongsTo(User::class);

在语法上是等效的。这意味着方法定义完全相同,并且由于两个参数都是字符串,因此不进行参数类型检查。

  

所以我喜欢Laravel在使用该语法糖时“只知道”模型在哪里。

是的,它知道。但这确实很简单。它使用Eloquent方法的string参数(现在我们知道,不管语法如何,它都是String)和提供的当前类的Namespace来定位模型定义。

例如此类定义

<?php

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

等同于

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

,也等同于

<?php

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne(App\Phone::class);
    }
}

您会注意到,第一个和第三个示例不需要namespace指令,因为它们使用的是绝对路径名。

答案 2 :(得分:1)

实际上Laravel不知道模型在哪里

如果此示例有效:

public function user()
{
    return $this->belongsTo(User::class);
}

如果模型可能位于相同的文件夹中,或者Namespace,那么您可能应该从其他命名空间中导入所需的模型。


//At the top of the file you will import the class

use Maybe\Another\Folder\Namespace\OtherObject;

public function user()
{
    return $this->belongsTo(OtherObject::class);
}

如果您不想“导入”对象,则应使用此类的完整路径。

public function user()
{
    return $this->belongsTo(App\OtherFolder\OtherObject::class);
}

总而言之,laravel不知道在哪里查找类定义,但是如果您在可以为Service Container解决的param中传递实例,但这是与模型绑定更相关的另一个主题

public function method(MyObject $instance)
{
    //Laravel will try to automatically generate an instance of $instance
}