我正在使用Laravel 4并且有两个具有相同命名空间的编写器包,使用PSR-0自动加载。 composer.json文件的简化原理图如下。
{
"require": {
"laravel/framework": "4.2.*",
"xxxxx/packageA": "1.2.0"
}
}
{
"require": {
"xxxxx/packageB": "~2.1.0"
},
"autoload": {
"psr-0": {
"NS": "src/"
}
}
}
{
"autoload": {
"psr-0": {
"NS": "src/"
}
}
}
因此,xxxxx/packageA
和xxxxx/packageB
在NS
目录中都有src
命名空间。这有用吗?我收到一条错误,说找不到班级NS\\X
。这是具有相同命名空间的包的Composer限制,或者这很好,我的代码中有错误吗?
答案 0 :(得分:3)
出于性能原因,您应该尽量避免两次定义相同的前缀。
技术上,Composer对两个定义同一前缀目录的包没有问题。但这会强制Composer首先检查其中一个目录是否包含该类。失败时,会检查第二个。
Composer尝试记住这些未命中,但结果仅在单个脚本运行期间使用,然后被遗忘。
假设您说明"NS":"src/"
,将在NS\X
中搜索班级名称src/NS/X.php
。但是,如果您更有可能拥有课程NS\X\A
和NS\Y\B
,则可以定义两个较长的前缀NS\X
和NS\Y
,而不是单个较短的前缀NS
。如果您只在NS
前缀中托管一个单独的类,则还可以使用整个类名作为前缀。
始终尽量使前缀尽可能长且精确。它们是名称空间,原因是每个名称空间只应该有一个程序包负责。拥有两个托管NS
类的软件包会使得很难检测到重叠:如果创建了两个具有完全相同名称的类,该怎么办?每个包具有不同的命名空间,这是不可能发生的。