我是一名新手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;
我希望我的问题不会太混乱。虽然我的代码现在正在运行,但我很模糊命名空间如何工作。
答案 0 :(得分:1)
规则很简单:
所有namespace
和use
语句始终使用完全限定名称(FQN),这意味着它们始终从全局命名空间开始,并且与其他任何名称都不相关。 use Foo\Bar
始终意味着\Foo\Bar
,无论您处于什么名称空间。
相对于使用use
语句建立的当前命名空间和/或别名,解析了其余代码中所有名称的文字提及。 new Foo
,extends Foo
等,或者__NAMESPACE__\Foo
,或者您在某些Foo
声明中可能有别名的use
。
如果要缩短名称,则需要使用use
语句,这些语句使用类的FQN,而不是相对于当前名称空间。