使用子命名空间自动加载我的类(Composer.json)

时间:2016-03-15 19:24:59

标签: php json composer-php

我已将以下内容添加到我的composer.json文件中。这工作正常,但我有一长串的子命名空间(例如Apple,Orange,Lemon,Pear,Banana等),我想要包含它们。

1)我是否必须指出每个子命名空间或者是否存在快捷方式,例如。 "Pure\\*": "pure"

composer.json:

"autoload": {

    "psr-4": {
        "Pure\\": "pure",
        "Pure\\Apple\\": "pure/src/Pure/Apple",
        "Pure\\Orange\\": "pure/src/Pure/Orange",
        "Pure\\Lemon\\": "pure/src/Pure/Lemon"

    }
}

2)最好是包含自定义自动加载文件:

composer.json:

"autoload": {

    "files": [
      "pure/src/Pure/autoload.php"
    ]
}

autoload.php:

spl_autoload_register(function ($class) {

    //etc...
}

1 个答案:

答案 0 :(得分:0)

  

我是否必须指明每个子命名空间或是否有快捷方式

在声明自动加载时,您应该使用尽可能长或合理的前缀。

如果此示例包是您创建的唯一一个包,并且它是唯一一个使用Pure作为命名空间的包,那么如果多个子目录中较长前缀的数量太高,请使用它。但是,这假设您正在使用的世界上任何其他包应避免使用相同的命名空间执行相同的操作。

Composer将能够在所有可用目录中搜索子命名空间,即如果您有两个包,并且在Pure中找到pure/src/Pure,则另一个包含{{1}在} Pure中,Composer将首先尝试在其中一个目录中找到一个类code/stuff,然后如果找不到它则必须尝试第二个。 Composer将记住Pure\Something\Class目录是否存在,并且如果必须加载该命名空间中的第二个类,则避免查找以pure/src/Pure/Something开头的任何内容。

但是从代码组织的角度来看,一个包应该只提供一组已定义的命名空间,而其他包不应该在同一个命名空间中提供类。您可以意外地将同一个类添加到两个包中,并获得有趣的问题,如果这两个文件不同,可能很难调试。

  

最好是包含自定义自动加载文件:

不,不惜一切代价避免它。你不会从中获益,因为总是必须加载文件,并且它是占用一些内存的重复代码 - 你已经拥有Composer的自动加载器。如果您的代码不符合PSR-4或PSR-0,则可以使用类映射。对于新代码:仅使用PSR-4!

此外,Composer无法优化您的自定义自动加载器。虽然应该测量任何优化的有效性(请阅读我的详细答案:Why use a PSR-0 or PSR-4 autoload in composer if classmap is actually faster?),但使用您自己的自动加载器将完全阻止您的代码进行优化(如果它有用)。