2015-10-15 41 views
0

我是新手laravel開發人員,我想了解名稱間距如何在這裏工作。所以我正在學習Repository模式,並決定繼續在我的項目中實施它。在laravel 5中名稱間距如何使用PSR4工作?

因此,我創建了一個名爲archive目錄,然後將其用在PSR4我composer.json文件像這樣裝:

"Archive\\": "archive/" 

現在我在archive文件夾中創建一個文件夾Repositories,我將創建所有庫。而我在其中的命名空間文件就像這樣:

namespace Archive\Repositories; 

這似乎工作正常。然後,我在Repositories文件夾內創建了一個Contracts文件夾,該文件夾將包含我將要使用的實現的所有接口,例如UserRepositoryInterface。我在Contracts文件夾中的命名空間文件是這樣的:

namespace Archive\Repositories\Contracts; 

哪個工作正常。

現在我的疑問在於我試圖在Repositories文件夾中做出的具體實現。例如,有一個DbUserRepository在合同文件夾中實現UserRepositoryInterface

現在,因爲我是新來這個我試過:

class DbUserRepository implements Contacts\UserRepositoryInterface 

,它工作得很好,但後來我想,我應該use它放在文件的頂部,像這樣:

use Contacts\UserRepositoryInterface; 

而且我可能只是這樣做:

class DbUserRepository implements UserRepositoryInterface 

它應該根據我的工作不錯,但它給了我一個不類FO但是當我做這樣的事情時:

use Archive\Repositories\Contacts\UserRepositoryInterface; 

它現在工作正常。但這是我模糊的地方。在DbUserRepository裏面,我已經在Archive\Repositories的nampspace裏了,爲什麼不直接從那裏查看合同文件夾呢?爲什麼我需要指定完整以此爲use Archive\Repositories\Contacts\UserRepositoryInterface;

爲什麼我不能只是說:

use Contacts\UserRepositoryInterface; 

我希望我的問題是不是太混亂。雖然我的代碼現在正在工作,但我很模糊命名空間如何工作。

回答

1

的規則非常簡單:

  1. 所有namespaceuse語句總是使用完全限定名(FQN),這意味着他們總是從全局命名空間開始,相對於別的都沒有。 use Foo\Bar總是表示\Foo\Bar,不管你在哪個命名空間。

  2. 其餘代碼中名稱的所有字面提及都是相對於使用use語句建立的當前名稱空間和/或別名來解析的。 new Foo,extends Foo等等或者意味着__NAMESPACE__\Foo或其他任何Foo您可能會在某些use語句中使用別名。

如果你想縮短名稱,你需要使用use報表時使用類的不是相對於當前命名空間的FQN。