[英]How does name spacing works using PSR4 in laravel 5?
我是laravel新手开发人员,在这里我试图了解命名空间的工作原理。 因此,我正在学习存储库模式,并决定继续在我的项目中实施它。
所以我创建了一个名为archive
的目录,然后使用PSR4将其加载到composer.json文件中,如下所示:
"Archive\\": "archive/"
现在,我在archive
文件夹中创建了一个Repositories
文件夹,将在其中创建所有存储库。 我在其中给文件命名,如下所示:
namespace Archive\Repositories;
这似乎工作正常。 然后,我在Repositories
文件夹内创建了一个Contracts
文件夹,该文件夹将保存我将要使用的实现的所有接口,例如UserRepositoryInterface
。 我正在命名合同文件夹中的文件,如下所示:
namespace Archive\Repositories\Contracts;
这也很好。
现在,我的疑问在于我要在“ Repositories
文件夹中进行的具体实现。 例如像有一个DbUserRepository
它实现了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 Archive\\Repositories\\Contacts\\UserRepositoryInterface;
我为什么不能说:
use Contacts\UserRepositoryInterface;
我希望我的问题不要太混乱。 尽管我的代码现在可以正常工作,但是我不清楚命名空间的工作原理。
规则很简单:
所有namespace
和use
语句始终使用完全限定名称 (FQN),这意味着它们始终从全局名称空间开始,并且与其他任何名称都不相关。 use Foo\\Bar
始终表示\\Foo\\Bar
,无论您使用的是什么名称空间。
其余代码中对名称的所有文字提及均相对于use
语句建立的当前名称空间和/或别名解决。 new Foo
, extends Foo
,这意味着__NAMESPACE__\\Foo
,或者您可能在某些use
语句中use
别名的任何Foo
。
如果要缩短名称,则需要使用use
语句,该语句使用类的FQN,而不是相对于当前名称空间的FQN。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.