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

标签 php laravel-4 namespaces composer-php autoload

介绍

我正在使用 Laravel 4 并且有两个具有相同命名空间的 Composer 包,使用 PSR-0 自动加载。 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/packageB 都在 src 目录中有一个 NS 命名空间。这行得通吗?我收到一条错误消息,指出未找到类 NS\\X。这是具有相同命名空间的包的 Composer 限制,还是这很好,但我的代码有错误?

最佳答案

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

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

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

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

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

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

相关文章:

php - DOMDocument xmlns 属性 - 如何获取它们?

c++ - getline() 函数从何而来?

javascript - 自动填写用户名和密码

php - Laravel 中的第 3 派对类

c++ - 对`(匿名命名空间)的 undefined reference ::

laravel-4 - 是否可以从 Laravel 中的 mysql 数据库表创建模型

php - 关系中的 Laravel 命名空间让我感到困惑

Php 页面无法从 mysql 值中识别 "ø"

javascript - php中的XSS黑名单

php - 函数参数列表中的赋值运算符(=)?