介绍
我正在使用 Laravel 4 并且有两个具有相同命名空间的 Composer 包,使用 PSR-0 自动加载。 composer.json文件的简化示意图如下。
Laravel 应用程序 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 限制,还是这很好,但我的代码有错误?
最佳答案
出于性能原因,您应该尽量避免定义相同的前缀两次。
从技术上讲,Composer 不存在为同一前缀定义目录的两个包的问题。但这会强制 Composer 首先检查其中一个目录是否包含该类。失败时,它会检查第二个。
Composer 试图记住这些遗漏,但结果只在单个脚本运行期间被使用,然后就被遗忘了。
假设你声明"NS":"src/"
,类名NS\X
将在src/NS/X.php<中搜索
。但是,如果您更有可能拥有 NS\X\A
和 NS\Y\B
类,则可以定义两个更长的前缀 NS\X
和NS\Y
而不是单个更短的前缀 NS
。如果您只在 NS
前缀中托管一个类,您也可以使用整个类名作为前缀。
始终尝试使前缀尽可能长且尽可能精确。它们是命名空间是有原因的,每个命名空间应该只负责一个包。为 NS
提供两个托管类的包会使检测重叠变得困难:如果创建了两个具有完全相同名称的类怎么办?每个包有不同的命名空间,这是不可能发生的。
关于php - 具有相同命名空间的不同 Composer 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121155/