【问题标题】:Autoload with composer of classes inside a single file使用单个文件中的类作曲家自动加载
【发布时间】:2014-10-11 03:08:24
【问题描述】:

我正在尝试使用一个使用命名空间但有一部分代码自动生成的库,因此它们在单个文件中生成多个类。

我们使用composer,我尝试像这样在psr-4中添加命名空间定义

"name\space\prefix\": "folder/where/the/file/is"

但是只有一个文件包含自动加载中的所有类,我想它没有找到这些类,因为它会搜索与您尝试加载的类同名的文件。有没有办法让作曲家自动加载知道这种情况并在类中使用自动加载?

【问题讨论】:

    标签: php namespaces composer-php autoload


    【解决方案1】:

    除了 PSR-4(或 PSR-0)之外,您还有两个选择:

    1. classmap - 这将扫描目录或文件中包含的所有类,并将结果放入文件中的 PHP 数组中。这需要在对正在扫描的文件进行更改时转储自动加载器。
    2. files - 只要包含 Composer 自动加载器,就会包含提到的文件。

    因此,您可以添加带有要使用类映射自动加载器扫描的自动生成类的文件,这将在第一次使用其中的任何类时加载该文件,或者您可以将其添加到文件自动加载中,这无论是否使用类,都将始终包含在内。

    如果考虑性能,除非类的数量很大并且类中的代码量很小,否则首选第一种选择。在类映射中拥有大量小类可能比一开始就加载它们的开销更大。

    在这些类中有大量代码,而且它们并不总是被使用,不总是加载它们所节省的数量或内存可能会更快。

    如果有疑问:测量它。如果性能损失太大,请考虑将类拆分为单个文件并使用 PSR-4。

    【讨论】:

    • 谢谢,尽管我已经有了自动拆分脚本来生成单个类,但您的回答为我提供了更多自动加载这些类的选项。非常感谢!
    • 不错。不知道这个。
    • 谢谢!我喜欢这个:“如果有疑问:测量它。”
    【解决方案2】:

    PSR4 spec 说:

    终止类名对应于以 .php 结尾的文件名。文件名必须与终止类名的大小写匹配。

    由于自动生成的代码与 PSR4 不兼容,因此 PSR4 自动加载器无法自动加载它。我会修复生成类的代码,或者使用require_once..(首选第一个。

    【讨论】:

    • 谢谢,问题是我无法更改自动生成的源代码的来源,我可以将文件拆分为类文件,但每次我都需要这样做更新这个库。不过谢谢你的回答
    • 如果您之后要拆分它们,您可以创建一个小的包装脚本,它首先执行生成器,然后在单个命令中将输出拆分为多个文件
    • 是的,我正在考虑这个解决方案 :) 谢谢
    猜你喜欢
    • 2021-06-27
    • 2018-03-30
    • 1970-01-01
    • 2015-12-24
    • 2016-08-13
    • 2017-01-14
    • 2018-02-27
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多