Composer自动加载类映射和include_path之间的区别

时间:2014-03-11 11:30:54

标签: php composer-php autoload

在有关自动加载的作曲家documentation部分,我发现至少有两种方法可以加载与psr-0/4不对应的类。第一个是指定composer.json文件的classmap属性,第二个是我的composer.json中的fill include-path属性。

正如我所看到的,include-path是更简单的功能,而classmap导致扫描指定位置的类。谁可以解释我应该在不同情况下使用哪一个?

1 个答案:

答案 0 :(得分:1)

避免使用include-path。它适用于期望include_path设置包含某些目录的旧软件,以便require_once "Relative/Path/To/Class.php"可以在任何位置工作(想想PEAR的工作方式)。使用太多路径会影响性能,因为PHP需要从第一个目录开始扫描,直到找到所请求的相对路径。

如果类不符合PSR-0或PSR-4,则类映射是一种始终可用的解决方案。自动加载的工作原理是知道类的名称并找出该类所包含的文件.PSR-0/4定义了一种通过使用和拆分类名来了解文件名的方法。但是,类映射会直接了解每个类名及其文件名。关于类映射的坏处是,如果它们变得太大,它们也会影响性能,因为加载一个巨大的类映射然后只使用大约1%的包含类会产生很大的开销。

include-pathclassmap不是互斥的。实际上,它们可能都是需要的:要加载第一个类,您需要类图(否则您将被迫显式使用require_once),如果该文件将使用加载依赖项require_once内的相对路径(并且不知道自动加载),必须设置正确的包含路径。

如果您有机会更改它,我强烈建议您避免设置包含路径,并且仅使用类映射功能来自动加载类(这意味着您应该删除该代码库中的任何include / require函数)。如果您的代码可以转换为符合PSR-0,那就更好了,但这对于旧代码来说通常是一个巨大的重写任务,几乎没有任何好处。只有当你真的拥有一个包含许多文件和类的巨大框架时,你才不得不担心性能 - 这通常不是旧代码库的情况。