首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用子命名空间(Composer.json)自动加载我的类

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

Stack Overflow用户
提问于 2016-03-15 19:24:59
回答 1查看 522关注 0票数 1

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

( 1)我必须指出每个子名称空间,还是有捷径。"Pure\\*": "pure"

composer.json:

代码语言:javascript
复制
"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:

代码语言:javascript
复制
"autoload": {

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

autoload.php:

代码语言:javascript
复制
spl_autoload_register(function ($class) {

    //etc...
}
EN

回答 1

Stack Overflow用户

发布于 2016-03-15 22:25:17

我必须指示每个子名称空间还是有快捷方式?

在声明自动标注时,您应该使用最长的可能或合理的前缀。

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

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

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

不如包含一个自定义的自动加载文件,而不是:

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

另外,您的自定义自动加载程序无法通过编写器进行优化。尽管任何优化都应衡量其有效性(请阅读我关于这个问题的详细答案:Why use a PSR-0 or PSR-4 autoload in composer if classmap is actually faster?),但是使用您自己的自动加载程序将完全防止您的代码被优化,如果它是有益的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36020339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档