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