如何使用composer生成的类映射添加不区分大小写的自动加载


How to add case insensitive autoloading using composer generated classmap?

我有一个遗留项目,它在不同的情况下有声明和类使用。

我想升级源到现代状态。首先,我想用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