PHP 8: план обновления

Как обновиться на PHP 8.0?

https://www.php.net/manual/ru/migration80.php

https://stitcher.io/blog/new-in-php-8

https://php.watch/versions/8.0

В первую очередь, ещё до обновления на PHP 8.0, нужно убедиться, что текущая кодовая база не выбрасывает никаких сообщений о deprications на текущей версии языка. Если такие есть, то их нужно поправить. То, что сегодня отображается как уведомление deprecated, завтра, на новой версии языка, может уже выбрасывать Fatal Error!

В PhpStorm есть инспекция «Language Level»: запустить её можно через меню Code -> RunInspection by Name… и в появившемся диалоге не забыть выбрать версию языка PHP 8 по ссылке Languages & Frameworks / PHP.

Хорошим подспорьем для плавного перехода будет кодовая база, написанная с использованием declare(strict_types=1); или покрытая статическим анализом типа Psalm,  PHPStan и т.п. Но если сейчас этого нет, то не стоит сломя голову добавлять типы, проще перейти на PHP 8.0 как есть, поправив все несовместимости. Однако, не имея типов, эти несовместимости будет сложнее найти.

Следующий полезный инструмент для проверки кода – это пакет PHPCompatibility. Устанавливается через composer и, по сути, это набор правил и проверок для PHP_CodeSniffer.

При первом запуске PHP_CodeSniffer у меня упал по недостатку памяти (не хватило 2Гб). И упал он на парсинге какого-то JavaScript файла. Поскольку JS нам не интересен, нужно добавить аргумент командной строки --extensions=php

Приложу ссылку на статью с подробным описанием, как запускать PHP_CodeSniffer вместе с PHPCompatibility: https://enzo.weknowinc.com/articles/2015/06/07/how-to-check-php-compatibility

После статической проверки и исправления собственного кода, нужно проверить зависимости, проверить пакеты перечисленные в composer.json и их зависимости.

В composer.json нужно установить значение config.platform.php и require.php в 8.0 и попробовать выполнить composer update – если какие-то из зависимостей, включая транзитивные, ещё не поддерживают PHP 8, то увидим подробное описание найденных несовместимостей.

Кстати, а чем отличаются эти две опции в composer.json — config.platform.php и версия PHP указанная в require? Хороший вопрос для отдельного выпуска Пятиминутки PHP. Впрочем, всё есть в документации к composer: https://getcomposer.org/doc/06-config.md#platform

Если нашлись несовместимые пакеты, что делать?

Проверить, возможно в composer.json зафиксированы слишком старые версии пакетов и их можно обновить на более свежие? А если в каких-то пакетах всё ещё нет поддержки PHP 8, то придётся делать fork. Кстати, чтобы использовать свой fork пакета вместо официального репозитория, в composer.json можно указать собственный альтернативный git репозиторий: https://matthewsetter.com/series/tooling/composer/forked-repositories/

Далее обратим внимание на используемые расширения PHP. Работают ли все подключённые внешние или не стандартные расширения с PHP 8? Все стандартные расширения «в поставке» точно поддерживают. А вот какие-то сторонние и экзотические нужно смотреть отдельно по их документации и последним обновлениям. Например, Xdebug уже поддерживает PHP 8!

Если все предварительные проверки пройдены, устанавливаем PHP 8 на локальную машину, чтобы прогнать тесты и проверить работоспособность кода в runtime.

Дальше, по идее, нужно обновлять production сервера. Но на деле не всегда это возможно сделать сразу. Поэтому какое-то время на production всё ещё будет крутиться предыдущая версия PHP. Как не запутаться и не испортить код?

Сначала нужно откатить версию в настройках composer config.platform.php до версии соответствующей production и сделать composer update.

Затем переключить Language Level в PhpStorm на более старую версию, чтобы случайно не написать какую-нибудь конструкцию в новом синтаксисе PHP 8. На самом деле PhpStorm автоматически подхватывает настройки версии PHP указанные в composer.json, но лучше ещё раз перепроверить и убедиться, что Language Level в PhpStorm соответствует production.

Не забудем про Continues Integration, чтобы в этот переходный период тесты гонялись и под текущую production версию PHP, и под PHP 8, таким образом мы сразу заметим случайную деградации кода.

После полного перехода на PHP 8, когда уже и на production серверах будет стоять свежая версия языка, можно начинать использовать новые фишки синтаксиса в коде. Обновить все исходники за раз до современного вида поможет утилита Rector – про неё я рассказывал в 81 эпизоде Пятиминутки PHP. Есть целый набор правил для Rector модифицирующих код под PHP 8, например, он может заменить switch/case на match (https://stitcher.io/blog/php-8-match-or-switch) где возможно или повсеместное внедрить constructor property promotion (https://stitcher.io/blog/constructor-promotion-in-php-8). 

Список доступных модификаций Rector далеко не полный, они не покрывают все возможности PHP8, это лишь начало пути.

Также я рекомендую применять правила Rector по одному и делать внимательный code review, т. к. иногда может что-то сломаться и потребуются ручные правки.

Нужно ли обновлять весь код на новый синтаксис единовременно? Обновление синтаксиса одним коммитом (или даже нескольким коммитами) сделает не релевантным git blame — возможно, это будет не очень удобно.

Я уже обновился на PHP 8.0 и записывал этот подкаст по памяти, возможно, упустил какие-то детали или нюансы. Если есть что добавить, пишите в комментариях на SoundCloud или на YouTube.

Lamoda Outbound

Евгений Сальников — тимлид команды доставки в Lamoda.

  • Путь от разработчика к CTO и обратно в разработку «руками»
  • Apache Camel — почему эта технология так недооценена?
  • 5 языков в одной команде: Java, Kotlin, PHP, Go, TypeScript
  • Большие PHP проекты и сервисная архитектура
  • План по переходу на PHP 8
  • Поможет ли утилита Rector?
  • Какие статические анализаторы для PHP используются? (спойлер: PHPStan)
  • Актуальные фреймворки? (спойлер: Symfony)
  • Любимый язык программирования?
  • Рекомендации по Телеграм чатам

https://camel.apache.org
https://www.youtube.com/watch?t=14864&v=ZYMEb_30kuo — Как жить с 5 языками программирования
https://t.me/symfoniacs

Clockwork — отладочная панель для PHP

Clockwork – это библиотека и расширение для браузера предоставляющие удобный интерфейс отладки производительности PHP кода.

Расскажу про свой опыт использования и сделаю небольшое сравнение с альтернативами.

Читать далее Clockwork — отладочная панель для PHP

Объекты передаются по ссылке или нет?

Часто можно услышать фразу, что в PHP «объекты всегда передаются по ссылке». На самом деле всё немного сложнее.

https://www.php.net/manual/ru/language.oop5.references.php

Читать далее Объекты передаются по ссылке или нет?

declare(strict_types=1)

В прошлом выпуске Пятиминутки PHP я рассказал, как обновлял кодовую базу с помощью утилиты Rector. Одно из направлений – простановка типов. Типы в свойствах классов, типы в параметрах функций, типы возвращаемых значений.

Но на этом я не остановился. Следующий шаг – проставить declare(strict_types=1)! Весь новый код, который я пишу по умолчанию идёт с declare(strict_types=1) в начале файла, это легко настроить в шаблонах PhpStorm. Но так ли просто взять и обновить старые исходники?

Читать далее declare(strict_types=1)

PhpStorm на macOS Metal

Расскажу про тикет JBR-745 о поддержке Metal в JetBrains Runtime, он же проект Lanai или JEP-382. Станут ли IDE от JetBrains отрисовываться со скоростью 300К FPS?

Видео, как я запускаю PhpStorm на Metal: https://youtu.be/T0CShIFwyRw

Ссылки по теме:

Архитектура сложных веб-приложений. С примерами на Laravel

Недавно я прочитал книгу «Архитектура сложных веб-приложений. С примерами на Laravel», автор Adel Faizrakhmanov.

Эта книга не пособие. Много шаблонов описаны поверхностно, с целью просто познакомить читателя с ними. Более подробное описание можно найти по ссылкам в конце.

Книга читается легко и с интересном, никакой воды, наоборот, иногда хочется продолжения и углубления в тему, больше примеров, но Адель оставляет нам это на самостоятельную проработку.

Читать далее Архитектура сложных веб-приложений. С примерами на Laravel

PHP Russia Online и другие Online конференции Олега Бунина

В этот период, когда массовые мероприятия запрещены, IT конференции переходят в Online формат. Как выглядят Online конференции и как они будут выглядеть в будущем? Обсуждаем с Олегом Буниным, организатором многих IT конференций в России, включая такие известные ежегодные события, как HighLoad++, РИТ++ и PHP Russia.

PHP Russia 2020
  • Список ближайших Online конференций
  • Возвращение Offline конференций уже осенью?
  • Собственная платформа для трансляций и её разработка
  • Как обеспечить хорошее качество трансляции?
  • Аудио-видео оборудование, свет, программное обеспечение для докладчиков
  • Тестирование и резервирование интернета докладчика, проблема последней мили
  • Один из возможных формат — предварительная запись доклада
  • Какие ещё форматы возможны?
  • Как удержать внимание аудитории?
  • Пауза, перемотка, ускорение
  • Общение с докладчиком в дискуссионной зоне. Zoom или внутри платформы Онтико?
  • Модерация дискуссионных комнат
  • Online нетворкинг участников
  • Доклады с разными финалами
  • 30 мастер классов в течение 10 дней после конференции?
  • Несколько потоков в один день или по 3 часа в течение недели? Что лучше? Что интереснее и удобнее зрителям?
  • Опыт уже прошедших двух Online конференций: Python Online и Saint HighLoad Online
  • Online консультации по PHP в рамках PHP Russia Online — приглашенные консультанты в отдельных Zoom комнатах
  • PHP Russia Online — бесплатная конференция
  • Каковы цены на другие Online конференции Онтико, например, РИТ++?
  • Из чего складывается цена Online конференции?
  • Что предпринимает команда Онтико, чтобы сделать конференции доступнее?
  • Спонсоры и партнёры — чем им может быть интересна Online конференция? Как могла бы выглядеть интеграция спонсора Online?
  • Эмоциональная составляющая и отсутствие реального общения между участниками
  • Бухать по Zoom?
  • Online никогда не заменит Offline
  • Останутся ли чисто-Online конференции в будущем, когда препятствия к проведению Offline будут сняты?
  • Статистика и динамика продаж билетов на предстоящие Online конференции по сравнению с прошлыми годами?
  • Англоязычные доклады и привлечение англоязычных слушателей
  • Синхронный перевод?

Приглашаю всех на PHP Russia Online 13 мая 2020 года

Также посмотрите расписание других конференций Олега Бунина