Фактически мы переносим наш проект PHP с PHP 5.3 на 7.2.
Недавно я перенес много библиотек в Composer.
У меня проблема с заменой PHPExcel
на PhpSpreadSheet
, который не поддерживает PHP 5.3.
На данный момент я храню PHPExcel
в отдельной папке и использую PHP_VERSION_ID
для использования того или другого.
// early in the file to use another dependency
require_once 'vendor/autoload.php';
.
.
.
if (PHP_VERSION_ID > 50400) {
$workbook = new PhpOffice\PhpSpreadsheet\Spreadsheet();
} else {
require_once 'lib/PHPExcel/Classes/PHPExcel.php';
$workbook = new PHPExcel();
}
На данный момент наш код должен работать под PHP 5.3 и 7.2.
Есть ли решение, чтобы автозагрузчик Composer не загружал PhpSpreadSheet
автоматически под PHP 5.3?
я обновил свой вопрос
Полностью удалите его из composer, потребуйте оба класса вручную, пока вы не перенесете на 7.2, а затем добавьте обратно в composer.
Вызывает ли автозагрузка ошибку, если PhpSpreadsheet загружен в версии 5.3?
оказывается, что электронная таблица не работает без Composer. Есть ли решение для создания пакета со своими зависимостями?
@Imaginaroom Да, одна из зависимостей Ошибка анализа: синтаксическая ошибка, неожиданный '.', Ожидание '&' или T_VARIABLE в vendor / markbaker / complex / classes / src / operations / add.php в строке 18
Думаю, я приму предложение @fire. Я попробую создать пакет PhpSpreadSheet со всеми его зависимостями в папке lib и обработать автозагрузку вручную. Спасибо .
Is there a solution to tell Composer autoloader to not autoload
PhpSpreadSheet
under PHP 5.3?
Автозагрузчик Composer не будет загружать какой-либо класс, пока вы его не запрашиваете. Таким образом, самый простой вариант указать Composer не загружать указанный класс - это не использовать его. :)
Однако переход с PHP 5.3 на 7.2 - сложная задача, попытка сделать ваше приложение совместимым с обеими этими версиями может сильно усложнить задачу. Я предлагаю рассматривать это как две отдельные версии, разработанные в разных ветках с разными требуемыми версиями PHP. Должно быть проще иметь две строки, в которых одна должна заботиться только о PHP 5.3, а вторая - только о PHP 7.2, чем взламывать одну строку для совместимости с PHP 5.3 и 7.2. PHP 5.3 был выпущен в 2009 году - он на 7 лет старше PHP 7.2, и за это время было изменено множество вещей.
Это не совсем правильно, так как пакет может всегда запрашивать выполнение кода через "autoload":{"files":"..."}
, поэтому технически пакет всегда может выполнять код, даже если он не используется. Эта функция автозагрузки файлов предназначена для импорта глобальных функций, которые по-прежнему не могут быть загружены автоматически. С другой стороны, более вероятно, что пакеты для старых версий PHP безоговорочно используют эту функцию - современные пакеты polyfill, например. от Symfony делают все возможное, чтобы повлиять на как можно меньше вариантов использования (ноль).
@Sven phpoffice/phpspreadsheet
не использует эту функцию, поэтому, хотя вы в целом правы, это не тот случай, о котором вы говорите.
пожалуйста, прикрепите пример