具有相同命名空间的不同Composer包

pas*_*has 5 php namespaces autoload composer-php laravel-4

介绍

我正在使用Laravel 4并且有两个具有相同命名空间的编写器包,使用PSR-0自动加载.composer.json文件的简化原理图如下.

Laravel app composer.json

{
    "require": {
        "laravel/framework": "4.2.*",
        "xxxxx/packageA": "1.2.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

xxxxx/packageA composer.json

{
    "require": {
        "xxxxx/packageB": "~2.1.0"
    },
    "autoload": {
        "psr-0": {
            "NS": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

xxxxx/packageB composer.json

{
    "autoload": {
        "psr-0": {
            "NS": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

所以,xxxxx/packageAxxxxx/packageB都有一个NS命名空间中的src目录.这有用吗?我收到一个错误,说NS\\X找不到课程.这是一个具有相同命名空间的包的Composer限制,或者这很好,我的代码中有错误?

Sve*_*ven 5

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

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

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

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

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