2015-10-15 106 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。