Композитор - максимальная версия PHP [дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

53
задан Fabian 9 October 2014 в 12:23
поделиться

5 ответов

Я считаю, что сомнительно сказать, что вы развиваетесь с использованием новейшего PHP и работаете с очень устаревшей версией. Из этого возникнет множество возможных проблем, а не только из-за исправлений безопасности, которые вам не хватает, но что еще более важно из-за исправлений PHP-ошибок, которые были введены в основном в версиях 5.3.9 и 5.3.23, что изменяет поведение PHP в некоторых подробности довольно принципиально. Не говоря уже о риске случайного использования функций 5.4 или 5.5.

И действительно, нет способа заставить Composer справиться с этой ситуацией. Версия PHP, используемая при запуске composer update, определяет разрешение зависимостей, на которые влияет PHP-версия и установленные расширения PHP.

Вы не можете определить, что пакет должен использоваться только для версий PHP между 5.3. 3 и 5.3.5, если PHP, который вы используете для обновления, не соответствует этой потребности в версии. Поскольку используемая версия PHP превышает ограничение на верхнюю версию, такой пакет не подходит для выполнения требования к версии, а Composer сообщает, что пакет не найден (не сообщая, что он видел пакеты, но их нужно было игнорировать из-за ограничение версии).

Есть, вероятно, три очевидных выхода:

  1. Снизьте свою среду разработки до версии, которую вы действительно используете. Если используется более одного: самый старый. Таким образом, будут согласованы любые требования для версий PHP. Затем запустите composer update, и все готово.
  2. Обновите производственную среду. Не нужно больше объяснять, но я должен упомянуть, что вы не только получаете очень много замечательных функций PHP, но и получаете значительное увеличение производительности, потому что PHP 5.5 действительно намного быстрее, чем 5.3.
  3. Добавьте конфигурацию «platform.php» в глобальный или проект composer.json. Это покажет, что Composer переопределит версию PHP, на которой запущен Composer, и вместо этого рассчитывает зависимости с этой другой версией PHP. composer config -g platform.php 5.3.5 для глобальной настройки (будет влиять на все последующие запуски Composer), без -g для локальной настройки (будет влиять только на операции Composer в этом проекте, если вы разрабатываете более чем один проект с разными производственными версиями PHP).
33
ответ дан Sven 18 August 2018 в 20:57
поделиться
  • 1
    Я добавил новый третий вариант, который должен быть действителен для более поздних версий Composer, вероятно, начиная с 1.0.0-beta1 и выше (я не буду вдаваться в альфа-заметки, чтобы точно сказать вам). Просто используйте стабильную версию 1.0.0. – Sven 15 April 2016 в 00:33
  • 2
    Как насчет использования composer.lock? – Arcesilas 30 November 2017 в 22:31
  • 3
    @Arcesilas Что вы имеете в виду? В основном речь идет о том, как ограничить Composer выбором пакетов для слишком продвинутых версий PHP во время обновления - поэтому файл блокировки, влияющий на результат обновления, в этом контексте не имеет смысла. – Sven 4 December 2017 в 18:07
  • 4
    Возможно, вам следует обновить ответ с помощью решения, предложенного в stackoverflow.com/a/37438345/2311074 ? – Adam 15 February 2018 в 17:05
  • 5
    У людей есть ограничения ... не так сомнительные, не так ли? – raoulsson 17 May 2018 в 20:05

Как насчет попытки оператора тильды

Tilde Operator ~ 1.2 Очень полезно для проектов, которые следуют за семантическим управлением версиями. ~ 1.2 эквивалентно> 1.2, 2.0. Более подробно см. Следующий раздел ниже.

Следующая значимая версия (оператор Тильды) #

Оператор ~ лучше всего объясняется примером: ~ 1.2 эквивалентен

= 1.2, & lt; 2,0, тогда как ~ 1.2.3 эквивалентно> = 1.2.3, 1.3. Как вы можете видеть, это в основном полезно для проектов, связанных с семантическим версированием. Общее использование будет означать минимальную младшую версию, на которую вы зависите, например ~ 1.2 (что позволяет все, вплоть до 2.0, но не включая). Поскольку теоретически не должно быть обратных разрывов совместимости до 2.0, это хорошо работает. Другой способ взглянуть на это состоит в том, что использование ~ указывает минимальную версию, но позволяет увеличить указанную последнюю цифру.

Примечание. Хотя 2.0-бета-1 строго до 2.0, ограничение версии, как ~ 1.2, не будет устанавливать его. Как сказано выше, 1.2 означает, что .2 может измениться, но 1. часть зафиксирована.

Примечание. Оператор ~ имеет исключение по своему поведению для основного номера выпуска. Это означает, например, что ~ 1 совпадает с ~ 1.0, поскольку он не позволит увеличить большее число, пытаясь сохранить обратную совместимость.

7
ответ дан Billy 18 August 2018 в 20:57
поделиться

Удалите каталог composer.lock и vendor .

Теперь установите platform на композитор. json

"config": {

    "platform": {
        "php": "7.0"
    }

},

и, наконец, выполнить команду composer install

2
ответ дан Jeff Puckett 18 August 2018 в 20:57
поделиться

Попробуйте это (удалите запятую):

"require": {
    "php": ">=5.3.3 <=5.3.5",
        .....
    },
2
ответ дан Mike Milkman 18 August 2018 в 20:57
поделиться

Поскольку параметр конфигурации в composer.json доступен. Вы могли бы что-то вроде этого:

{
    "name": ".../...",
    "config": {
        "platform": {
            "php": "5.3.5"
        }
    },
    "require": {
        ...
    }
} 

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

60
ответ дан NuSphere 18 August 2018 в 20:57
поделиться
  • 1
    Хотя этот параметр указан, библиотека все еще устанавливает версию, которая больше указанной версии PHP. Например, я указал PHP версию 5.4.36, но Composer по-прежнему устанавливает Symfony версии 3.1.3, которая требует 5.5+. Вывод: не работает. – Raptor 9 August 2016 в 04:42
  • 2
    платформа в основном предназначена для того, чтобы вы подделывали пакеты платформы (PHP и расширения), чтобы вы могли эмулировать производственный env. требуют лучшего выбора между версией X и версией Y – Walt Sorensen 3 February 2017 в 08:02
  • 3
    Это сработало для меня! Мне нужно было установить пакеты, совместимые с PHP & lt; = 7.0.16 – StockBreak 31 July 2017 в 14:11
  • 4
    Возможно, в Raptor была ошибка где-то в цепочке, но config.platform.php предназначена для решения именно этой проблемы в этом вопросе, и она работает. Возможно, используемая версия композитора еще не поддерживала его. – Narretz 14 November 2017 в 14:10
  • 5
    Именно то, что я искал, спасибо! Важно отметить, что после установки этого параметра вам нужно будет запустить composer update, как и любые другие изменения, связанные с зависимостью, с composer.json. – Evan Mattson 30 May 2018 в 15:55
Другие вопросы по тегам:

Похожие вопросы: