2016-07-29 30 views
2

我似乎遇到了幾個laravel命名空間定義(在類中)的味道,我想知道如果有人比別人更好,或者甚至可能是錯的。Laravel命名空間有多挑剔?

  1. namespace mydomain\app\controllers
  2. namespace dev.mydomain.com\app\controllers
  3. namespace app\controllers
  4. namespace \app\controllers

幾個問題:

  • 我知道初始\是OPTIO納爾,但什麼mydomain前綴?它是必需的還是可選的?
  • 它有區別嗎dev.mydomain.com是或只是mydomain
  • 它只是一個與文件夾名稱相同的問題嗎?
+1

初始斜線指的是[全局命名空間](http://www.php.net/manual/en/language.namespaces.global.php)。如果在命名空間之前使用'dev'或者不使用,則無關緊要。這只是一個名字空間。文件夾名稱本身與名稱空間無關,但某些加載程序確實將名稱空間用作文件夾的映射。看看[這裏](https://daylerees.com/php-namespaces-explained/)以獲得更全面的解釋。 – Andrew

+0

'myproject \ app \ controllers'和'\ app \ controllers'和'app \ controllers'有區別嗎? – Maxcot

+0

是的。有。根據laravel使用的加載標準[psr-4](http://www.php-fig.org/psr/psr-4/),命名空間必須是'\ (\ )* \ '其中'SubNamespaceNames'可以任意多。 – Andrew

回答

1

有一個在你提到的那些名字空間沒有更好或更壞。

命名空間已添加到語言以防止在單獨的包中發生名稱衝突。

例如,你可以有一個類User在自己的名稱空間\MyApp\User,並且還使用了一個名爲User類第三方軟件包,但在其自己的命名空間\Package\User

這是最初的想法。後來,人們決定我們可以使用這個命名空間來自動加載一些類。一個原始的想法是應該在MyApp/User.php中找到\MyApp\User。很簡單。

這個擁有先進的,當然,你可以通過搜索「PHP自動加載」或更好「的作曲家自動加載」閱讀更多有關。

以及有關初始\,它並沒有在一些地方重要,但它的問題在其他地方。當聲明一個命名空間時,它並不重要,例如namespace \MyApp\Usernamespace MyApp\User相同。此外,use聲明的行爲如此。但是當你要使用一個班級,即new \MyApp\User() vs new MyApp\User,它確實不同。你可以在PHP documentation找到更多的信息。

好的,足夠的背景。你的問題具體。

我知道初始\是可選的,但是mydomain前綴是什麼?它是必需的還是可選的?

至於Laravel情況下,它是不可選的。看看composer.json,在psr-4下,你會發現app文件夾有一個爲命名空間定義的前綴。這就是你應該使用的類(如果他們在app文件夾中)。要了解更多信息,請查找PSR-4

它有什麼區別使用dev.mydomain.com是或只是mydomain?

我想我已經提到過PSR-4,所以請使用任何東西。

它只是一個與文件夾名稱相同的問題嗎?

這也是PSR-4。閱讀更多信息,並回答所有問題。

但總而言之,我們有兩個基於PHP命名空間自動加載類的標準:PSR-0和PSR-4。

在PSR-0(舊),該目錄結構必須命名空間完全匹配,也就是說,如果你的根文件夾爲src,你班被命名爲\Package\User,那麼你在你的文件系統有src/Package/User.php

在PSR-4中,我們可以爲目錄設置名稱空間前綴。例如,你說無論在文件夾src中,它只是以\App\Package命名空間開始。一個名爲\App\Package\User的類應該駐留在src/User.php,當然有正確的命名空間。這正是Laravel所使用的,以及現在大部分的軟件包。

+0

謝謝,這是非常豐富的。 – Maxcot