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