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


Autoload My Classes with Sub-Namespaces (Composer.json)

我已将以下内容添加到我的composer.json文件中。这工作正常,但我有一长串子命名空间(例如。苹果, 橙子, 柠檬, 梨, 香蕉...等)我想包括的。

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

作曲家.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)是否最好包含一个自定义自动加载文件:

作曲家.json:

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

自动加载.php:

spl_autoload_register(function ($class) {
    //etc...
}

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

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

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

Composer 将能够在所有可用目录中搜索子命名空间,即如果你有两个包,一个说Pure可以在pure/src/Pure中找到,另一个说Purecode/stuff中找到,Composer 将尝试先在其中一个目录中找到一个类Pure'Something'Class, 然后,如果找不到,则必须尝试第二个。作曲家将记住pure/src/Pure/Something目录是否存在,如果必须加载该命名空间中的第二个类,则避免查找以 Pure'Something 开头的任何内容。

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

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

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

此外,您的自定义自动加载器无法通过编辑器进行优化。尽管任何优化都应该衡量其有效性(请阅读我对此的详细回答:如果类映射实际上更快,为什么要在作曲器中使用PSR-0或PSR-4自动加载?),使用自己的自动加载器将完全阻止您的代码被优化,如果它是有益的。