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


Composer: Require a package with custom namespace

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

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

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

我告诉composer我想要ramsey/uuid包,它下载并包含了这个包。

当我想访问包上的类时,我不得不这样做:

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

是否有一种方法可以要求包并强制使用更简单的命名空间,例如for。'Uuid::uuid4();,避免需要写完整的NS包括包作者?

我应该如何改变我的composer.json才能做到这一点?谢谢你。

:我知道PHP的use。我可以use Rhumsaa'Uuid'Uuid;…然而,我需要在每个文件中都这样做,这是不实际的。如果我把一个小的自我使用框架放在一起就更少了。例如,我想将'Util'UUID映射到'Rhumsaa'Uuid'Uuid

我也认为文件autoload_psr4.php可以改变来实现这一点,但是在update之后,所有的变化都被丢弃。

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

Composer不需要对PHP名称空间做任何操作。用于标识软件包的名称与PHP名称空间无关。它们不需要在任何方面匹配。Composer只提供一个自动加载器,它将包含您在代码中使用的类的源代码。可能的替代方法是使用include_once()require_once()手动加载源代码,或者自己创建一个自动加载器来完成此操作。

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

这些类名也趋向于变得很长,特别是PSR-0自动加载的发明(在很长一段时间内,这是唯一定义的PSR标准)。

使用名称空间,您至少可以获得一种方法来缩短代码中的类名引用。

您必须在使用的每个地方使用原始的长格式,或者您必须使用较短的别名导入它。是的,你必须在每个文件中重复import子句——但是你不会把每个类都导入到每个文件中,你只会导入你实际使用的类。

使用IDE非常有助于完成这些任务。它们为您提供了一种在所有可用类中搜索您想使用但不记得的类的方法。它们还处理将带有名称空间的类导入到文件中。您几乎不需要手动"在任何地方添加导入"。