我有一个遗留项目,它在不同的情况下有声明和类使用。
我想升级源到现代状态。首先,我想用composer自动加载来取代传统的自动加载。但composer不提供不区分大小写的自动加载。
如何使用composer类映射和不敏感的自动加载?
将classmap
添加到composer.json
。
"autoload": {
"classmap": ["folder1/", "folder2/"]
},
然后运行composer.phar dumpautoload
以创建composer/autoload_classmap.php
。
更改代码。之后
require VENDOR_PATH . '/autoload.php';
添加
$class_map = require VENDOR_PATH . '/composer/autoload_classmap.php';
$new_class_map = array();
foreach ($class_map as $class => $file)
$new_class_map [strtolower($class)] = $file;
unset($class_map);
spl_autoload_register(function ($class)use($new_class_map)
{
$class = strtolower($class);
if (isset($new_class_map[$class]))
{
require_once $new_class_map[$class];
return true;
}
else
return false;
}, true, false);
unset($new_class_map);
这是我找到的最简单的方法。
您不需要使用composer。
修复代码。也就是说,使用Composer创建类的类映射,然后对所有这些类名进行不区分大小写的搜索,并从类映射中将它们替换为正确的区分大小写版本。
或者创建自己的不区分大小写的类映射加载程序,如果它发现一个带有不正确大小写的类名,它会自动抱怨,并让你一个接一个地修复软件——有丢失某些大小写的危险,只有当代码更改重新排列自动加载的类的顺序时,这些情况才会在以后被检测到。
如果您的生产设置支持spl_autoload_register(从5.1.2开始),您可以将自己的自动加载实现与composer的一起添加。以下是我的方法(它也依赖于名称间距):
autoload.php
<?php
spl_autoload_register('classLoader');
function classLoader($className, $prefix = '') {
$pathParts = explode('''', $className);
$newPathParts = array_map('strtolower', $pathParts);
$classPath = $prefix . implode(DIRECTORY_SEPARATOR, $newPathParts) . '.php';
if ( file_exists($classPath) ) {
require_once $classPath;
}
}
?>
在你的档案中,你可以随心所欲地混合你的案件。
$obj = new View'Home'Home();
与相同
$obj = new vIEw'home'homE();
我的问题解决方案。正在形成一个附加卡(lowstr密钥)和另一个引导加载程序(在通常的自动加载程序中)。对现有代码透明地工作。在默认加载程序后使用,忽略供应商目录
最好使用-a(classmap authority)选项生成映射,这样代码就不会寻找其他加载选项,它们可能会导致错误。
https://gist.github.com/AndryG/9325f36a9350f2f7ccdef002c2aa0882