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

时间:2014-08-04 14:34:10

标签: php laravel-4 namespaces composer-php autoload

简介

我正在使用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/packageAxxxxx/packageBNS目录中都有src命名空间。这有用吗?我收到一条错误,说找不到班级NS\\X。这是具有相同命名空间的包的Composer限制,或者这很好,我的代码中有错误吗?

1 个答案:

答案 0 :(得分:3)

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

技术上,Composer对两个定义同一前缀目录的包没有问题。但这会强制Composer首先检查其中一个目录是否包含该类。失败时,会检查第二个。

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

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

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