2015-08-19 18 views
5

在Laravel 5.1,爲CLI類的內核看起來像這樣Laravel - 爲什麼`:: class`恆

#File: app/Console/Kernel.php 
class Kernel extends ConsoleKernel 
{ 
    //...  
    protected $commands = [ 
     \App\Console\Commands\Inspire::class, 
    ]; 
    //... 
} 

,在改變到使用預定義/魔法不斷::class

\App\Console\Commands\Inspire::class 

在功能上不同於簡單地使用類名?

\App\Console\Commands\Inspire 

回答

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); 
    } 

} 

參考:PHP Docs

+0

Derp,thanks!我忘記了用字符串包圍類名的舊方法(因爲PHP不會自行標記類名)。 –

6

對於執行代碼它沒有什麼區別,但::class常數對開發工具最有用。如果您使用的類名,你必須把它寫成字符串'\App\Console\Commands\Inspire' - 這意味着:

  1. 沒有IDE自動完成
  2. 自動重構的任何詢問服務(「重命名類」)
  3. 沒有命名空間解決
  4. 沒有辦法自動檢測用途(IDE)或依賴(pDepend)

旁註:之前PHP 5.5出來了,我用來定義常數__CLASS在我的大部分類中都是爲了這個目的:

class X { 
    const __CLASS = __CLASS__; 
} 
+0

這應該是一個被接受的答案。 – e1v