介绍

我正在使用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/packageAxxxxx/packageBNS目录中都具有src命名空间。这行得通吗?我收到一条错误消息,指出未找到NS\\X类。这是具有相同 namespace 的软件包的Composer限制,还是很好,并且我的代码有错误?

最佳答案

由于性能原因,您应尽量避免两次定义相同的前缀。

从技术上讲,Composer不会出现两个软件包为同一前缀定义目录的问题。但这迫使Composer首先检查其中一个目录是否包含该类。如果失败,它将检查第二个。

Composer尝试记住这些遗漏,但结果仅在单个脚本运行期间使用,然后被遗忘。

假设您声明"NS":"src/",将在NS\X中搜索一个类名称src/NS/X.php。但是,如果您更有可能拥有NS\X\ANS\Y\B类,则可以定义两个较长的前缀NS\XNS\Y,而不是单个较短的前缀NS。如果您仅在NS前缀内托管一个类,则也可以使用整个类名作为前缀。

始终尝试使前缀尽可能长和尽可能精确。由于某种原因,它们是 namespace ,每个 namespace 仅应负责一个包。如果有两个软件包托管NS的类,将很难检测到重叠:如果创建两个名称完全相同的类怎么办?每个包使用不同的 namespace ,就不会发生这种情况。

关于php - 具有相同 namespace 的不同Composer软件包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25121155/

10-14 19:52