首页 文章

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

提问于
浏览
5

简介

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

1 回答

  • 3

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

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

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

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

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

相关问题