>我在作曲家自动加载器方面有问题。目前正在开发大约 10 年前开发的应用程序。 项目中当前使用的 2 个库的文件夹结构不符合 psr0 和 psr4 自动加载规则。
作曲家安装后的结构如下所示
例 1
文件夹路径:/供应商/应用手册/ORS/类/模型/国家/地区
文件名:类。国家.php
PHP 类名: 国家
例 2
文件夹路径:/供应商/应用手册/ORS/类/模型/国家/地区
文件名:类。国家收藏.php
PHP 类名: 国家集合
请告知我应该怎么做,以便作曲家自动加载程序可以检测到这些文件。
提前谢谢你
从文档中:
您可以使用类图生成支持来定义不遵循 PSR-0/4 的所有库的自动加载。要配置此项,请指定要搜索类的所有目录或文件。
例:
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
您仍然可以将composer.json
添加到旧库中classmap
并为它们定义自动加载类型。
您可以重命名这些文件以使它们与 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兼容类和旧代码时,它将对您有所帮助。