不使用 psr0 和 psr4 自动加载的文件的作曲家(symfony 项目)

composer with files not using psr0 and psr4 autoloading (symfony project)

我的作曲家自动加载器有问题。目前正在开发大约 10 年前开发的应用程序。项目中目前使用的2个库的文件夹结构不符合psr0和psr4的自动加载规则

composer安装后的结构如下

示例 1

文件夹路径:/vendor/AppBook/ORS/class/model/Country

文件名: class.Country.php

PHP Class 姓名: 国家

示例 2

文件夹路径:/vendor/AppBook/ORS/class/model/Country

文件名: class.CountryCollection.php

PHP Class 名称: CountryCollection

请告知我应该怎么做才能让 composer auto loader 检测到这些文件。

提前致谢

来自the docs

You can use the classmap generation support to define autoloading for all libraries that do not follow PSR-0/4. To configure this you specify all directories or files to search for classes.

示例:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

您仍然可以将 composer.json 添加到旧库并为它们定义 classmap 自动加载类型。

您可以重命名这些文件以使其与 PSR-4 兼容(不太可能,因为这需要使用名称空间 - 在 10 年前的代码中?)或 PSR-0。此外,您必须删除通过 includeinclude_oncerequirerequire_once 对这些文件的任何显式加载,因为文件名已更改。

PHP 将按 class 名称自动加载这些 classes。如果 class 名称中的区分大小写在任何地方都没有受到尊重,这可能 运行 会出现问题。示例:

class UpperCase {}

$a = new upperCase();

自动加载会尝试查找以 upperCase.php 结尾的文件,该文件与所需的 PSR-0 UpperCase.php 不匹配,因此代码将失败。然而,这会奏效,但情况不会好转:

class UpperCase {}

$b = new UpperCase();
$a = new upperCase();

原因是 PHP 对待 class 名称不区分大小写,因此一旦 class 被加载,您可以在其名称中使用任何大小写。它只是您的代码路径中必须匹配的第一次出现。问题是要确定它到底在哪里,所以基本上它必须在任何地方都是正确的。

是的,class地图功能是更简单的方法。但是您仍然希望删除 include/require 调用以稍微优化性能,因此无论如何您都必须修改代码。尽管它已经很老了,但它必须得到维护——所以为什么不完全做到这一点,切换到一个众所周知的自动加载标准。当您必须同时维护 PSR-0/4 兼容 classes 和这个旧代码时,它会在很长的 运行 中帮助您。