Laravel - 为什么`:: class`常量

Ala*_*orm 5 php class constants laravel

在Laravel 5.1中,CLI类的内核看起来像这样

#File: app/Console/Kernel.php
class Kernel extends ConsoleKernel
{
    //...    
    protected $commands = [
        \App\Console\Commands\Inspire::class,
    ];
    //...
}
Run Code Online (Sandbox Code Playgroud)

是使用预定义/魔术常量的更改 ::class

\App\Console\Commands\Inspire::class
Run Code Online (Sandbox Code Playgroud)

功能上不同于简单地使用类名?

\App\Console\Commands\Inspire
Run Code Online (Sandbox Code Playgroud)

Joe*_*inz 6

不,::class在类上使用会返回完全限定的类名,因此它与写入相同'App\Console\Commands\Inspire'(在引号中,因为它是一个字符串).该class关键字是PHP 5.5的新增内容.

在这个例子中它看起来很愚蠢,但它可以用于例如测试或定义关系.例如,如果我有一个Article班级和一个ArticleComment班级,我可能最终会这样做

use Some\Long\Namespace\ArticleComment;

class Article extends Model {

    public function comments()
    {
        return $this->hasMany(ArticleComment::class);
    }

}
Run Code Online (Sandbox Code Playgroud)

参考:PHP文档.


Fab*_*ler 6

为了执行代码,它没有什么区别,但是::class常量对于开发工具最有用.如果使用类名,则必须将其写为字符串'\App\Console\Commands\Inspire'- 这意味着:

  1. 没有IDE自动完成
  2. 没有自动重构的支持("重命名类")
  3. 没有名称空间解析
  4. 无法自动检测用法(IDE)或依赖项(pDepend)

旁注:在PHP 5.5出现之前,我曾经__CLASS在我自己的大多数类中定义一个常量,用于此目的:

class X {
    const __CLASS = __CLASS__;
}
Run Code Online (Sandbox Code Playgroud)