我的作曲家自动加载器有问题。目前正在开发大约10年前开发的应用程序。当前在项目中使用的2个库的文件夹结构不符合psr0和psr4自动加载规则。
作曲家安装后的结构如下所示
示例1
文件夹路径:/ vendor / AppBook / ORS / class / model / Country
文件名:class.Country.php
PHP班级名称:国家/地区
示例2
文件夹路径:/ vendor / AppBook / ORS / class / model / Country
文件名:class.CountryCollection.php
PHP班级名称:CountryCollection
请告知我应该怎么做才能让作曲家自动加载程序检测到这些文件。
提前谢谢
答案 0 :(得分:2)
来自the docs:
您可以使用类映射生成支持为不遵循PSR-0/4的所有库定义自动加载。要配置它,请指定要搜索类的所有目录或文件。
示例:
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
您仍然可以将composer.json
添加到旧版库中,并为其定义classmap
自动加载类型。
答案 1 :(得分:0)
您可以重命名这些文件以使它们与PSR-4兼容(不太可能,因为这需要使用名称空间 - 在10年的代码中?)或PSR-0。此外,您必须通过include
,include_once
,require
或require_once
删除这些文件的任何明确加载,因为文件名已更改。
PHP将按类名自动加载这些类。如果在任何地方都不尊重类名中的区分大小写,则可能会遇到问题。例如:
class UpperCase {}
$a = new upperCase();
自动加载会尝试查找以upperCase.php
结尾的文件,该文件与所需的PSR-0 UpperCase.php
不匹配,因此代码将失败。但是,这将起作用,使情况不再好转:
class UpperCase {}
$b = new UpperCase();
$a = new upperCase();
原因是PHP将类名称视为不区分大小写,因此一旦加载了类,就可以在其名称中使用任何大小写。它只是代码路径中第一次出现匹配。问题是要确定它到底在哪里,所以基本上它必须在任何地方都是正确的。
是的,类图功能是更简单的方法。但是您仍然希望删除include/require
次调用以优化性能,因此您无论如何都必须触摸代码。尽管它已经老了,但它必须保持 - 所以为什么不完全这样做,转而采用一种众所周知的自动加载标准。从长远来看,当您必须并行维护PSR-0/4兼容类和旧代码时,它将对您有所帮助。