使用单个文件中的类作曲家自动加载

Posted

技术标签:

【中文标题】使用单个文件中的类作曲家自动加载【英文标题】: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"

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

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

PSR4 spec 说:

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

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

【讨论】:

谢谢,问题是我无法更改自动生成的源代码的来源,我可以将文件拆分为类文件,但每次我都需要这样做更新这个库。不过谢谢你的回答 如果您之后要拆分它们,您可以创建一个小的包装脚本,它首先执行生成器,然后在单个命令中将输出拆分为多个文件 是的,我正在考虑这个解决方案 :) 谢谢

以上是关于使用单个文件中的类作曲家自动加载的主要内容,如果未能解决你的问题,请参考以下文章

psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合

将在自动加载的命名空间类文件中声明的函数转换为全局函数

如何在开发多个包时处理多个作曲家自动加载器

作曲家安装,自动加载转储后事件返回错误

Composer 自动加载始终是第一位的

laravel 5.2 中的作曲家更新