不使用 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。此外,您必须删除通过 include
、include_once
、require
或 require_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 和这个旧代码时,它会在很长的 运行 中帮助您。
我的作曲家自动加载器有问题。目前正在开发大约 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。此外,您必须删除通过 include
、include_once
、require
或 require_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 和这个旧代码时,它会在很长的 运行 中帮助您。