Composer:需要一个带有自定义命名空间的包

Composer: Require a package with custom namespace

我已经逐渐开始在我的 PHP 项目中使用 Composer,但是有些事情我一直质疑。

例如,假设这是我的 composer.json 文件:

{
    "require": {
        "ramsey/uuid": "~2.8"
    }
}

我告诉作曲家我想要这个包 ramsey/uuid 并且正如预期的那样它下载并包含了这个包。

当我想访问包上的 类 时,我不得不做类似的事情:

$uuid = \Rhumsaa\Uuid\Uuid::uuid4();

有没有一种方法可以要求包并强制使用更简单的名称空间,例如。 \Uuid::uuid4();,避免需要编写包括包作者在内的完整 NS?

我应该在我的 composer.json 上做些什么才能做到这一点?谢谢。

:我知道PHP的use。我可以 use Rhumsaa\Uuid\Uuid;... 但是我需要在每个文件中都这样做,这是不切实际的。如果我正在组装一个小型的自用框架,那就更少了。我希望即时将 \Util\UUID 映射到 \Rhumsaa\Uuid\Uuid.

我还认为可以更改文件 autoload_psr4.php 来完成此操作,但是在 update 之后所有更改都将被丢弃。

不,您无法缩短这些命名空间。

Composer 不需要对 PHP 命名空间做任何事情。您用来标识软件包的名称与 PHP 命名空间无关。他们不必以任何方式匹配。 Composer 仅提供一个自动加载器,其中包含您在代码中使用的 class 的源代码。可能的替代方案是使用 include_once()require_once() 手动加载该源代码,或者自行创建一个自动加载器来执行此操作。

现在 Composer 已经不在了,我们可以讨论名称空间和 class 名称。在 PHP 5.3 之前,没有命名空间。 类 要么通常不在多个项目中使用,因为它们是用可能会与其他具有相同名称的 class 冲突的短名称创建的,或者它们被扩展为在其名称中包含一个区分组件,像 Zend_Controller_AbstractsfController(来自 Symfony 1)。

这些 class 名称也往往会变得很长,尤其是随着 PSR-0 自动加载的发明(很长一段时间以来,这是唯一定义的 PSR 标准)。

有了命名空间,您至少可以获得一种方法来缩短代码中的那些 class 名称引用。

您必须在每个使用的地方使用原始的长格式,或者您必须使用较短的别名导入它。是的,您必须在每个文件中重复导入子句 - 但您不会将每个 class 导入每个文件,您只会导入您实际使用的 classes。

使用 IDE 对这些任务非常有帮助。他们为您提供了一种在所有可用 class 中搜索您想要使用但不记得的那个的方法。他们还处理将命名空间 classes 导入到您的文件中。您很少需要手动 "add the imports everywhere".