在laravel 5中如何使用PSR4工作名称间距?

时间:2015-10-15 08:29:20

标签: php laravel namespaces laravel-5

我是一名新手laravel开发人员,我试图了解命名空间如何在这里工作。所以我正在学习Repository模式,并决定继续在我的项目中实现它。

所以我创建了一个名为archive的目录,然后在我的composer.json文件中使用PSR4加载它,如下所示:

"Archive\\": "archive/"

现在我在Repositories文件夹中创建了一个archive文件夹,我将在其中创建所有存储库。我就是这样命名文件:

namespace Archive\Repositories;

这似乎工作得很好。然后我在Contracts文件夹中创建了一个Repositories文件夹,该文件夹将保存我将要使用的实现的所有接口,例如UserRepositoryInterface。我是Contracts文件夹中的命名空间文件,如下所示:

namespace Archive\Repositories\Contracts;

哪个也正常。

现在我的疑问在于我想在Repositories文件夹中进行的具体实现。例如,有一个DbUserRepository在Contracts文件夹中实现了UserRepositoryInterface

既然我是新手,我就试过了:

class DbUserRepository implements Contacts\UserRepositoryInterface

它工作正常然后我认为我应该use它在文件顶部如下:

use Contacts\UserRepositoryInterface;

我可以这么做:

class DbUserRepository implements UserRepositoryInterface

它应该可以正常工作,但它给了我一个没有找到异常的课程,但是当我做了类似的事情时:

use Archive\Repositories\Contacts\UserRepositoryInterface;

现在工作正常。但这是我模糊的地方。在DbUserRepository内部我已经在Archive\Repositories的nampspace中了,为什么它不继续从那里查看Contracts文件夹?为什么我需要将其全部指定为use Archive\Repositories\Contacts\UserRepositoryInterface;

为什么我不能说:

use Contacts\UserRepositoryInterface;

我希望我的问题不会太混乱。虽然我的代码现在正在运行,但我很模糊命名空间如何工作。

1 个答案:

答案 0 :(得分:1)

规则很简单:

  1. 所有namespaceuse语句始终使用完全限定名称(FQN),这意味着它们始终从全局命名空间开始,并且与其他任何名称都不相关。 use Foo\Bar始终意味着\Foo\Bar,无论您处于什么名称空间。

  2. 相对于使用use语句建立的当前命名空间和/或别名,解析了其余代码中所有名称的文字提及。 new Fooextends Foo等,或者__NAMESPACE__\Foo,或者您在某些Foo声明中可能有别名的use

  3. 如果要缩短名称,则需要使用use语句,这些语句使用类的FQN,而不是相对于当前名称空间。