У меня проблема с автозагрузчиком композитора. В настоящее время работает над приложением, которое было разработано около 10 лет назад. Структура папок из двух библиотек, которые в настоящее время используются в проекте, не соответствуют правилам автоматической загрузки psr0 и psr4.
Структура после установки композитора выглядит следующим образом
Пример 1
Путь к папке: / vendor / AppBook / ORS / класс / модель / Страна
Имя файла: class.Country.php
Имя класса PHP: Страна
Пример 2
Путь к папке: / vendor / AppBook / ORS / класс / модель / Страна
Имя файла: class.CountryCollection.php
Имя класса PHP: CountryCollection
Посоветуйте, пожалуйста, что мне делать, чтобы автозагрузчик композитора мог обнаружить эти файлы.
заранее спасибо
От документы:
Вы можете использовать поддержку генерации карты классов для определения автозагрузки для всех библиотек, которые не следуют 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-совместимые классы и этот старый код параллельно.