Опубликован тестовый выпуск PHP 8.0.0, Beta 2. Официальный релиз стабильной версии PHP 8 запланирован на 26 ноября. В нее будет внесен ряд критических изменений, функций и улучшений производительности.
PHP 8 предлагает набор новых функций, таких как JIT-компилятор, типы объединения, атрибуты и многое другое.
Новые возможности
JIT
PHP – это интерпретируемый язык: он не компилируется как программа на C, Java или Rust. Вместо этого он транслируется в машинный код во время выполнения. JIT – это метод, который компилирует части кода так, что вместо них можно использовать скомпилированную версию. Этот процесс можно описать как «кэшированную версию» интерпретируемого кода.
«Монитор» JIT будет анализировать код во время его выполнения. Если части кода выполняются повторно, он помечает их как «теплые» или «горячие», в зависимости от частоты. «Горячие» части можно скомпилировать как оптимизированный машинный код и использовать вместо оригинального. Это должно значительно увеличить производительность PHP при работе с повторяющимися кусками кода.
Демонстрация JIT с генерацией фракталов: https://youtu.be/dWH65pmnsrI
Атрибуты
Атрибуты в PHP – аналог аннотаций или декораторов в других языках. Они предлагают способ указывать полную информации о типе без необходимости синтаксического анализа. Атрибуты могут применяться к:
- функциям (включая закрытие и короткое закрытие)
- классам (включая анонимные классы), интерфейсы, черты характера
- константам класса
- свойствам класса
- методам класса
- параметрам функции / метода
Продолжаются споры по поводу принятого на текущий момент синтаксиса <<Attr>> – он считается слишком многосимвольным и сложночитаемым при использовании вложенных аннотаций. В качестве альтернативы предлагаются варианты: @@Attr, #[Attr], @[Attr], @:Attr или @{Attr}. Окончательный вариант пока не определен – на странице, посвященной синтаксису, проходит голосование, итоги которого будут подведены 2 сентября.
Выражение соответствия
PHP 8 представляет новое выражение match – эту функцию стоит использовать в качестве альтернативы switch.
Синтаксис выражения match значительно короче, не требует заявления break, позволяет комбинировать условия, использует строгие сравнения типов и не выполняет приведения типов.
Продвижение свойств
Когда параметр метода использован с одним из ключевых слов видимости public, protected или private, он считается «продвигаемым». Для каждого продвигаемого параметра будет добавлено свойство с тем же именем и переадресация этого свойства, включенного в тело конструктора, в соответствии с подробными правилами.
Отмена проверки наследования частных методов
Ранее в PHP применялись одинаковые проверки наследования к общедоступным, защищенным и частным методам. Частные методы должны были следовать тем же правилам подписи, что и защищенные и общедоступные методы. Это бессмысленно, поскольку закрытые методы не доступны дочерним классам.
Теперь проверка наследования не будет выполняться для частных методов.
WeakMap
С помощью WeakMap можно организовывать карты «слабых ссылок» (ссылок на объекты, которые не предотвращают сборку мусора для этих объектов). Таким образом реализуется ресурсосберегающее кэширование объектов, не приводящее к утечкам памяти.
Завершающая запятая в списках параметров
В PHP 8 теперь поддерживается завершающая запятая при указании списка параметров в вызовах функций и конструкторах методов. Также завершающие запятые поддерживаются и в списке замыканий use.
ext-json доступен всегда
PHP больше нельзя скомпилировать без включенного расширения JSON. Разработчикам теперь не требуется делать проверку, что расширение существует – они смогут рассчитывать на присутствие JSON всегда.
Критические изменения
Ошибки согласованного типа
Пользовательские функции в PHP будут вызывать TypeError, а внутренние – нет, они теперь выдают предупреждения и возвращают null.
Режим ошибки PDO по умолчанию
Ранее при возникновении ошибки SQL не выдавал предупреждения и не создавал исключения, если разработчик не реализует свою собственную явную обработку ошибок. Теперь режим PDO исправлен.
Разумный результат при сравнении чисел и строк
Исправление ситуации в PHP, когда 0 == "foo" давало результат true.
Ожидания
Существует вероятность, что программистам потребуется внести некоторые изменения в свой код, чтобы он работал на PHP 8. Однако, обновление не должно вызвать сложностей, так как большинство изменений были уже реализованы в предыдущих версиях.
Согласно плану выпуска следующую версию Beta 3 стоит ожидать 3 сентября. Это будет последняя бета перед основной стабильной версией PHP 8.0 в ноябре 2020 года. Следует отметить, что бета-версия не подходит для использования в продакшене и предназначена только для ознакомления.
Напомним также, что в июле представитель Microsoft заявил, что компания не собирается выпускать официальные сборки для PHP 8 и более поздних версий.