Избегайте автозагрузки composer. php для разбора всех файлов - PullRequest
1 голос
/ 14 февраля 2020

Вот моя проблема: я обновил сложное приложение до PHP 7.4, и да, я не достаточно тщательно протестировал.

Теперь я хотел бы запустить задачу с более старым PHP версия, но она не может проанализировать все файлы моего поставщика. Здесь ошибка и строка. Это новая функция PHP 7.4.

PHP Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное '?', Ожидаемая переменная (T_VARIABLE) в. \ Vendor \ sentry \ sentry \ src \ functions . php в строке 25

 function captureMessage(string $message, ?Severity $level = null): ?string

До сих пор я думал, что Composers vendor\autoload.php загружает классы и функции в каталог вендора только по требованию. Неиспользуемые классы и, следовательно, файлы-нарушители, записанные в PHP 7.4, не будут загружены.

К сожалению, я замечаю, что require_once('./vendor/autoload.php') достаточно, чтобы увидеть ошибку разбора. Можно ли настроить Composer таким образом, чтобы он не загружал файлы поставщика заранее, а загружал их только после запроса классов или функций?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

Ваше первоначальное предположение было верным: в общем случае автозагрузчик PHP загружает классы только тогда, когда они используются, а Composer просто обеспечивает реализацию этого автозагрузчика.

Однако Composer также включает в себя функция для безусловной загрузки файла . Это используется, когда пакет содержит функции, константы или конфигурацию, которые не могут быть загружены по требованию (поскольку автозагрузчик PHP обрабатывает только классы).

Один из используемых вами пакетов использует эту функцию , поэтому каждый раз, когда вы включаете vendor/autoload.php, указанный файл является обязательным. В показанном сообщении об ошибке мы видим имя пакета sentry/sentry, а в этого пакета composer.json мы видим это:

"autoload": {
    "files": [
        "src/functions.php"
    ],
    "psr-4": {
        "Sentry\\": "src/"
    }
},

Лучший способ обойти это вероятно, чтобы понизить эту зависимость, и любые другие, которые включают код, который работает только под PHP 7.4. Для этого вы можете просто перезапустить composer update на вашей старой версии PHP, и он будет выбирать только пакеты, поддерживающие эту версию.

Вы также можете указать platform опция в вашем composer.json, чтобы всегда запрашивать зависимости для более старой PHP версии, даже если вы используете Composer в PHP 7.4. Однако существует риск того, что полученные зависимости будут несовместимы с PHP 7.4.

1 голос
/ 14 февраля 2020

В вашем composer. json вы можете добавить platform в вашу конфигурацию, чтобы заставить его разрешать зависимости для указанной c версии PHP.

https://getcomposer.org/doc/06-config.md#platform

"config": {
    "platform": {
        "php": "5.6"
    },
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...