Что нового в php 8

Что нового в PHP 8?

PHP – один из самых популярных языков программирования, широко востребованный при разработке веб-приложений. Гибкий и интерпретированный, доступный и универсальный, PHP поддерживает большинство серверов и более двух десятков баз данных.

Он открывает безграничные возможности для хостинга, ведь применяемые на основе PHP сервисы отлично масштабируются. Несмотря на частую критику инструмента, получившего в упрощенном переводе прозвище «препроцессор», колоссальное количество удачных проектов в своей основе используют именно его. WordPress, Facebook, Drupal и другие проекты создавались с помощью PHP.

Язык PHP имеет много преимуществ:

  • Выучить общие принципы работы с PHP можно легко и быстро;
  • Шаблонизатор предоставляет возможность писать сценарии для веб-приложений, программ и мобильных приложений;
  • Совместимость со всеми операционными системами и платформами;
  • Высокая производительность и финансовая доступность.

Недовольство инструментом имеет корни в недалеком прошлом. Простота и доступность для изучения привела к тому, что на PHP создавали страницы, приложения все, кто хоть что-нибудь понимал в программировании. Это приводило к распространению некачественных программ и веб-ресурсов.

PHP имеет и реальные недостатки. Это узкопрофильная разработка, предназначенная исключительно для программирования для сети Интернет. К недостаткам относятся также противоречивость кода, погрешности безопасности.

Вкратце о нововведениях в PHP8

Востребованность в совокупности с уязвимостью языка провоцирует постоянное обновление и усовершенствование PHP. Некоторое время назад мы рассказывали о нововведениях в PHP 7.4, однако уже в ноябре 2020 года состоялся выпуск версии PHP 8. Усовершенствованный вариант имеет ряд преимуществ. Рассмотрим, какие возможности были добавлены разработчиком:

  • Union Types
  • JIT
  • Nullsafe-оператор
  • Именованные аргументы
  • Атрибуты
  • Выражение соответствия
  • Новый тип mixed
  • Throw-выражения
  • Weak maps
  • Неименованные исключения

Union Types

Совокупность нескольких типов, указывающих на возможность использования любого из них, представляет собой функцию Union Types. Новая версия PHP позволяет использовать объявления Union Types, проверка которых осуществляется моментально, одновременно с выполнением. Такая возможность появилась взамен аннотаций PHP docs.

Компилятор Just In Time, именуемый JIT, оптимизирует производительность процессов во время работы программ, приложений и т.д., благодаря динамической компиляции. Первоочередно код транслируется в промежуточное представление, затем в машинный код. Выполнение происходит на процессоре, без использования виртуальной машины.

Nullsafe-оператор

Прежняя система, при работе с оператором null, демонстрировала неудобное свойство: невозможность применения в цепочке вызовов методов. Возникала потребность в промежуточных проверках или в применении помощников.

Внедрение Nullsafe-оператора позволяет разработчику наблюдать поведение методов.

Именованные аргументы

Именованные аргументы открывают возможность передачи значения в функцию путем указания имени значения. Для разработчика это способ оптимизировать рабочий процесс, и спокойно без потерь пропускать второстепенные по значимости параметры. При этом порядок аргументов больше не имеет значения.

Атрибуты

Атрибуты предоставляют возможность добавления метаданных с нативным синтаксисом PHP в классы удобным способом. Данная опция позволяет разделить абстрактную реализацию некоторой функции и ее кодовое использование. Атрибуты – это новые возможности и технически более совершенный способ добавлять дополнительную информацию и конфигурацию.

Выражение соответствия

Новинка PHP 8 – match. Это выражение с возможностью сохранения в переменной либо возврата. Новые условия позволяют применять исключительно однострочные выражения без использования конструкции break.

Новый тип mixed

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

Throw-выражения

Обновленная версия позволит преобразование в выражение инструкции throw – в предыдущих выпусках такой опции не было. Такое нововведение расширяет возможности использования инструмента.

Weak maps

Восьмая версия дополнена классом WeakMaps, позволяющим сохранять ссылку на объект. При этом сам объект можно свободно удалить.

Неименованные исключения

В прежних версиях перехват исключения был возможен с предварительным сохранением его в переменной. При этом не имело значения, использовалась ли переменная. PHP 8 позволяет перехватывать исключения, указание переменной при том не требуется. При этом следует иметь ввиду, что тип нужно указывать обязательно: PHP 8 не предусматривает возможность оставлять пустой catch.

Новые возможности PHP 8

Помимо добавленных для разработчиков возможностей, версия PHP 8 дополнена рядом других существенных изменений (деление на ноль, возвращение типа переменной, идентификация ресурса и т.д.).

С полным списком изменений в версии PHP 8 вы можете ознакомиться на официальном сайте.

PHP 8 на хостинге SpaceWeb

PHP 8 для действующих клиентов хостинга SpaceWeb

Вы можете выбрать нужную версию PHP в разделе «Сайты» → «Настройки конфигурации». Обратите внимание, что PHP 8 доступен в связке с Apache 2.4, в котором отличается синтаксис некоторых директив .htaccess. Подробнее в разделе «Помощь» Перед сменой PHP настоятельно рекомендуем удостовериться в совместимости вашего сайта с выбираемой версией.

PHP 8 для новых клиентов

Хотите протестировать работу своего сайта на PHP 8 одним из первых? Заказывайте виртуальный хостинг в SpaceWeb — у нас PHP 8 уже доступен на любом тарифе! При необходимости мы можем бесплатно перенести ваш сайт к нам на хостинг. А бесплатный тестовый период в 14 дней позволит вам не спеша провести тестирование сайта на самом современном оборудовании и программном обеспечении.

Топ-6 сервисов для проверки кроссбраузерности сайта

NVMe SSD диски — обзор технологии

10 инструментов сжатия изображений

Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽

Надежный хостинг для сайта с бесплатным доменом и SSL за 159 ₽

Еще на эту тему:

Стань партнером

Выгодное предложение SpaceWeb:

  • до 30% вознаграждение ежемесячно,
  • быстрая оплата на карту,
  • работа по договору
  • О компании
  • Контакты
  • Новости компании
  • Важное
  • Скачать приложение

© 2001-2022 ООО «СпейсВэб» Все права защищены.
Лицензия на предоставление телематических услуг связи № 163230.

Стань партнером

Выгодное предложение SpaceWeb:

  • до 30% вознаграждение ежемесячно,
  • быстрая оплата на карту,
  • работа по договору
    О компании
  • Скачать приложение

© 2001-2022 ООО «СпейсВэб» Все права защищены. Лицензия на предоставление телематических услуг связи № 163230.

Общество с ограниченной ответственностью «СпейсВэб». Генеральный директор: Шпагин А.Ю. Юридический адрес: 198095, город Санкт-Петербург, улица Маршала Говорова, дом 35, корпус 5, литер Ж, этаж 4, офис 371. Адрес офиса: 198095, Санкт-Петербург, ул. Маршала Говорова, д. 35, корп. 5, лит. Ж, бизнес-центр «Терминал», офис 401.

Что нового в PHP 8

PHP 8 — следующая мажорная версия, примерная дата релиза конец 2020 года.

Итак, PHP 7.4 вышел и должен закончить эпохальную ветку седьмой версии. Столько много всего интересного было в ней реализовано, но разработчики PHP не стоят на месте и уже готовят 8 версию, которая будет содержать в себе много грандиозных вещей, о которых я и буду вас уведомлять по мере одобрения RFC или пулл-реквестов.

PHP 8 — новая основная версия PHP, как ожидается, выйдет 26 ноября 2020 года. Так как PHP 8 все еще находится в активной разработке, то список новых функций, со временем, будет расти и меняться, его первая альфа ожидается 18 июня 2020 года.

Появление JIT как раз во время. Компилятор обещает значительные улучшения производительности, хотя и не всегда это будет в контексте веба. На данный момент не было сделано никаких точных ориентиров, но они обязательно появятся. Что такое JIT и для чего он будет нужен, можно почитать здесь

Union Types 2.0 (Объединенные типы)

«Объединенные типы» принимают значения нескольких разных типов, а не одного. PHP уже поддерживает два специальных типа объединения:

Type или null, используя специальный синтаксис » ?Type»

array или Traversable, используя специальный тип iterable.

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

Объединенные типы указываются с использованием синтаксиса T1|T2|… и могут использоваться во всех позициях, где типы в настоящее время принимаются:

Обратите внимание, что тип void не может быть частью типа объединения, так как он означает «вообще ничего-возвращаемого значения». Кроме того, nullable союзы могут быть написаны с использованием |null или с использованием существующей ? записи:

Оператор nullsafe rfc

Если вы знакомы с оператором объединения c нулевым значением ( ?? ), думаю, что вы уже знакомы с его недостатками: он не работает с вызовами методов. Вместо этого вам нужны будут промежуточные проверки или надо будет полагаться на опциональных помощников, предоставляемых некоторыми фреймворками:

С добавлением оператора nullsafe мы теперь можем иметь поведение методов, подобное слиянию null!

Именованные аргументы rfc

Именованные аргументы позволяют передавать значения в функцию, указывая имя значения, так что вам не нужно учитывать их порядок, а также вы можете пропустить необязательные параметры:

Можно комбинировать именованные аргументы с обычными позиционными аргументами, а также можно указать только некоторые из необязательных аргументов функции, независимо от их порядка:

Атрибуты, обычно известные в других языках, как аннотации или декораторы, предлагают способ добавлять метаданные в классы, без распарсивания докблоков. Широкое использование парсинга комментариев к документам пользователя показывает, что это очень востребованная функция сообщества. Атрибуты представляют собой специально отформатированный текст, заключенный в «<<» и «>>» путем повторного использования существующих токенов T_SL и T_SR.

Атрибуты могут применяться ко многим вещам в языке:

  • функции (включая замыкания и короткие замыкания)
  • классы (включая анонимные классы), интерфейсы, трейты
  • константы класса
  • свойства класса
  • методы класса
  • параметры функции/метода

Вот пока примерный взгляд из RFC:

Обратите внимание, что эта база Attribute вызывалась PhpAttributeв исходном RFC, но впоследствии была заменена другим RFC . Если вы хотите больше узнать как работают атрибуты, и как вы можете создать свой собственный, то можете прочитать об атрибутах в этом посте Атрибуты в PHP 8.

Выражение соответствия v2

Это можно было бы назвать старшим братом switch выражения: match может возвращать значения, не требует break операторов, может комбинировать условия, использует строгие сравнения типов и не выполняет никаких типов принуждения.

Можно писать так:

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

Объявление свойств в конструкторе RFC

В настоящее время определение простых объектов значений требует большого количества шаблонов, поскольку все свойства должны повторяться как минимум четыре раза. Рассмотрим следующий простой класс:

Свойства повторяются 1) в объявлении свойства, 2) в параметрах конструктора и 3) два раза в назначении свойства. Кроме того, тип свойств так же повторяется дважды.

Этот RFC добавляет синтаксический сахар для создания объектов значений или объектов передачи данных. Вместо указания свойств класса и конструктора для них PHP теперь может объединять их в одно. В результате код сокращается до:

Или еще пример, вместо этого:

Теперь вы можете сделать это:

Этот сокращенный код строго эквивалентен предыдущему примеру, но более лаконичен. Выбор синтаксиса взят из родственного языка Hack. Более подробно можно почитать в посте объявление свойств в конструкторе.

Новый тип возврата static

Хотя возвращение уже было возможно self, но до PHP 8 он не был допустимым типом возврата static . Учитывая динамически типизированный характер PHP, эта функция будет полезна для многих разработчиков.

Новый тип mixed v2

С добавлением скалярных типов в PHP 7, обнуляемых в 7.1, объектов в 7.2 и, наконец, типов объединения в 8.0, люди, пишущие код PHP, могут явно объявлять информацию о типах для большинства параметров функции, возвращаемых функций, а также свойств класса. Однако в PHP не всегда поддерживаются типы, и, скорее всего, он всегда будет позволять опускать информацию о типах. Но это приводит к проблеме того, что ее значение неоднозначно, когда отсутствует информация о типе:

  • Функция не возвращает ничего или null
  • Мы ожидаем один из нескольких типов
  • Мы ожидаем, тип, который не может быть подсказан в PHP

Из-за причин, приведенных выше, хорошо, что тип mixed был наконец добавлен, Сам по себе mixed означает один из этих типов:

  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string

Обратите внимание, что mixed также может использоваться как параметр или тип свойства, а не только как тип возвращаемого значения. Также обратите внимание, что, поскольку mixed уже включает в себя null, это не может сделать его обнуляемым. Следующее вызовет ошибку:

Поскольку в PHP оператор throw не может создавать исключения в тех местах, где разрешены только выражения, такие как функции стрелок, оператор объединения и тернарный оператор. Этот RFC предлагает преобразовать утверждение throw в выражение, чтобы эти случаи стали возможными.

Есть и другие места, где он может быть использован, которые являются более спорными. Эти случаи разрешены в данном RFC

Наследование приватных методов

Раньше PHP применял одинаковые проверки наследования для публичных, защищенных и приватных методов. Другими словами: private методы должны следовать тем же правилам подписи метода, что и protected и public методы. Это не имеет смысла, так как private методы не будут доступны дочерним классам.

Этот RFC изменил данное поведение, так что эти проверки наследования больше не выполняются для приватных методов. Кроме того, использование final private function также не имело смысла, поэтому теперь это вызовет предупреждение:

Weak maps (Слабые карты)

Построенный на RFC слабых ссылок, который был добавлен в PHP 7.4, В PHP 8 WeakMap добавляет ​​реализацию, в которой хранятся ссылки на объекты, которые не препятствуют сборке мусора этими объектами.

Возьмем для примера ORM, они часто реализуют кэши, которые содержат ссылки на классы сущностей, чтобы улучшить производительность отношений между сущностями. Эти объекты сущности нельзя собирать, пока кеш имеет ссылку на них, даже если кеш является единственной ссылкой на них.

Если этот слой кэширования использует слабые ссылки и карты вместо этого, PHP будет собирать эти объекты мусором, когда ничто больше не ссылается на них. Особенно в случае ORM, которые могут управлять несколькими сотнями, если не тысячами объектов в запросе; слабые карты могут предложить лучший, более дружественный к ресурсам способ работы с этими объектами.

Вот как выглядят слабые карты, пример из RFC:

Использование ::class на объектах

Небольшая, но полезная новая функция: теперь можно использовать ::class на объектах, результат будет идентичен get_class():

Неподхваченные уловы

Всякий раз, когда вы хотели перехватить исключение до PHP 8, вы должны были сохранить его в переменной независимо от того, использовали ли вы эту переменную или нет. При отсутствии захвата вы можете пропустить переменную, поэтому вместо этого:

Теперь вы можете сделать это:

Обратите внимание, что необходимо всегда указывать тип, вы не можете иметь пустой catch. Если вы хотите перехватить все исключения и ошибки, вы можете использовать их Throwable как тип перехвата .

Завершающая запятая в списках параметров

При вызове функции, в списках параметров все еще отсутствовала поддержка запятой. Теперь это разрешено в PHP 8, что означает, что вы можете делать следующее:

Создать DateTime объекты из интерфейса

Вы уже можете создать DateTime объект из DateTimeImmutable объекта, используя DateTime::createFromImmutable($immutableDateTime), но наоборот было сложно. Добавление DateTime::createFromInterface() и DatetimeImmutable::createFromInterface() теперь позволяет получить обобщенный способ конвертировать DateTime и DateTimeImmutable объекты друг в друга.

Новый Stringable интерфейс

Появится новый интерфейс Stringable, который автоматически добавляется в классы, которые реализуют магический метод __toString(), и нет необходимости реализовывать его вручную.

У данного RFC две цели:

  • разрешить использовать, string|Stringable чтобы выразить string|object-with-__toString()
  • предоставить прямой путь обновления с PHP 7 до 8

Новая функция str_contains()

str_contains проверяет, содержится ли строка в другой строке, и возвращает логическое значение (true/false), независимо от того, была ли найдена строка. Некоторые могут сказать, что это давно пора, и нам, наконец, больше не нужно полагаться на strpos, чтобы узнать, содержит ли строка другую строку.

Теперь вы можете сделать это

Новые функции str_starts_with() и str_ends_with()

Две другие давно ожидаемые функции так же добавлены в ядро. str_starts_with() проверяет, начинается ли строка с другой строки, и возвращает логическое значение (true/false).

str_ends_with() логично проверяет, заканчивается ли строка другой строкой, и возвращает логическое значение (true/false).

Как правило, эта функциональность достигается за счет использования существующих строковых функций, таких как substr, strpos/strrpos, strncmp или substr_compare(часто в сочетании с strlen), которые имеют различные недостатки. Что интересно,функциональность str_starts_with и str_ends_with настолько необходима, что ее поддерживают многие основные PHP-фреймворки, включая Symfony, Laravel, Yii, FuelPHP и Phalcon.

Новая функция fdiv

Новая функция fdiv делает что-то подобное типа функций fmod и intdiv, что позволяет произвести деление на 0. Но вместо ошибок вы получите INF, -INF или NAN, в зависимости от случая.

Новая функция get_debug_type()

get_debug_type() возвращает тип переменной. Что-то похоже выдает gettype(), но get_debug_type() возвращает более полезный вывод для массивов, строк, анонимных классов и объектов. Например, вызов gettype() класса \Foo\Bar вернется object. Использование get_debug_type() вернет имя класса.

Полный список различий между get_debug_type()и gettype() можно найти в RFC.

Новая функцияp get_resource_id()

Ресурсы — это специальные переменные в PHP, ссылающиеся на внешние ресурсы. Например, соединение MySQL, или дескриптор файла.

Каждому из этих ресурсов присваивается идентификатор, хотя ранее единственным способом узнать, что это идентификатор, было преобразование ресурса в int:

PHP 8 добавляет функцию get_resource_id() , делая эту операцию более очевидной и безопасной для типов:

Улучшение абстрактных методов трейтов

Трейты — это «механизм повторного использования кода в языках с единичным наследованием, таких как PHP». Обычно они используются для объявления методов, которые можно использовать в нескольких классах. Трейты так же могут содержать абстрактные методы, которые должны быть реализованы классами, использующими их. Однако есть предостережение: до PHP 8 сигнатура этих реализаций методов не проверялась. Следующее было действительным:

PHP 8 будет выполнять правильную проверку подписи метода при использовании свйоства и реализации его абстрактных методов. Это также означает, что подписи методов должны совпадать. Другими словами, тип и количество требуемых аргументов должны быть одинаковыми:

Как бы то ни было, по словам автора RFC Никиты Попова , проверка подписи в настоящее время применяется только точечно:

  • Это не применяется в наиболее распространенном случае, когда реализация метода обеспечивается в используемом классом
  • Это принудительно, если реализация исходит из родительского класса
  • Это принудительно, если реализация исходит от дочернего класса

Объектно-ориентированная альтернатива token_get_all()

Функция token_get_all() возвращает массив значений. Этот RFC добавляет класс PhpToken с методом PhpToken::getAll(). Эта реализация работает с объектами вместо простых значений, его легче читать, и потребляет меньше памяти.

Изменения синтаксиса переменных RFC

Унифицированный синтаксис переменной RFC устранил ряд несоответствий в синтаксисе переменной PHP. Этот RFC намеревается решить небольшую горстку пропущенных дел.

Тип аннотации для внутренних функций

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

Расширение ext-json всегда доступен

Ранее можно было скомпилировать PHP без включенного расширения JSON, теперь это больше невозможно. Поскольку JSON так широко используется, то разработчики теперь всегда могут рассчитывать на его наличие, вместо того, чтобы лишний раз убеждаться, что расширение существует.

PHP 8 — серьезное обновление и, следовательно, будут серьезные изменения. Лучшее, что можно сделать, это взглянуть на полный список критических изменений в документе ОБНОВЛЕНИЕ . Однако многие из этих критических изменений устарели в предыдущих версиях 7. *, поэтому, если вы были в курсе последних лет, не так уж сложно перейти на PHP 8.

Согласованные постоянные ошибки типов

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

Множество ошибок, которые ранее вызывали только предупреждения или уведомления, были преобразованы в правильные ошибки:

  • Undefined variable (Неопределенная переменная): Error исключение вместо уведомления
  • Undefined array index (Неопределенный индекс массива): предупреждение вместо уведомления
  • Division by zero (Деление на ноль): DivisionByZeroError исключение вместо предупреждения
  • Attempt to increment/decrement property ‘%s’ of non-object (Попытка увеличить/уменьшить свойство «%s» необъекта): Error исключение вместо предупреждения
  • Attempt to modify property ‘%s’ of non-object (Попытка изменить свойство «%s» необъекта): Error исключение вместо предупреждения
  • Attempt to assign property ‘%s’ of non-object (Попытка назначить свойство «%s» необъекта): Error исключение вместо предупреждения
  • Creating default object from empty value (Создание объекта по умолчанию из пустого значения): Error исключение вместо предупреждения
  • Trying to get property ‘%s’ of non-object (Попытка получить свойство «%s» необъекта): предупреждение вместо уведомления
  • Undefined property (Неопределенное свойство): %s::$%s: предупреждение вместо уведомления
  • Cannot add element to the array as the next element is already occupied (Невозможно добавить элемент в массив, так как следующий элемент уже занят): Error исключение вместо предупреждения
  • Cannot unset offset in a non-array variable (Невозможно сбросить смещение в переменной, не являющейся массивом): Error исключение вместо предупреждения
  • Cannot use a scalar value as an array (Нельзя использовать скалярное значение в качестве массива): Error исключение вместо предупреждения
  • Only arrays and Traversables can be unpacked (Только массивы и Traversables могут быть распакованы): TypeError исключение вместо предупреждения
  • Invalid argument supplied for foreach() (Указан неверный аргумент для foreach ()): TypeError исключение вместо предупреждения
  • Illegal offset type (Недопустимый тип смещения): TypeError исключение вместо предупреждения
  • Illegal offset type in isset or empty (Недопустимый тип смещения в isset или empty): TypeError исключение вместо предупреждения
  • Illegal offset type in unset (Недопустимый тип смещения в unset): TypeError исключение вместо предупреждения
  • Array to string conversion (Преобразование массива в строку): предупреждение вместо уведомления
  • Resource ID#%d used as offset, casting to integer (%d) (Идентификатор ресурса #%d, используемый в качестве смещения, приведение к целому числу (%d)): предупреждение вместо уведомления
  • String offset cast occurred (Произошло приведение смещения строки): предупреждение вместо уведомления
  • Uninitialized string offset: %d (Смещение неинициализированной строки: %d): предупреждение вместо уведомления
  • Cannot assign an empty string to a string offset (Невозможно назначить пустую строку для смещения строки): Error исключение вместо предупреждения

Оператор @ больше не «глушит» фатальные ошибки

Вполне возможно, что это изменение может выявить ошибки, которые снова были скрыты до PHP 8. Обязательно установите display_errors=Off на своих производственных серверах!

Стандартный режим ошибки PDO

Из RFC: текущий режим ошибок по умолчанию для PDO — бесшумный. Это означает, что при возникновении ошибки SQL никакие ошибки или предупреждения не могут выдаваться и не генерируются исключения, если разработчик не реализует свою собственную явную обработку ошибок.

Этот RFC изменяет ошибку по умолчанию, которая изменится на PDO::ERRMODE_EXCEPTION.

Уровень сообщений об ошибках по умолчанию

Теперь по умолчанию в error_reporting уровень ошибок будет установлен в E_ALL вместо текущего E_ALL &

E_DEPRECATED. Это означает, что могут появиться много ошибок, которые ранее незаметно игнорировались, хотя, возможно, уже существовали до PHP 8.

Приоритет при конкатенации

Хотя это изменение уже устарело в PHP 7.4, теперь это изменение вступает в силу. Если бы вы написали что-то вроде этого:

PHP ранее интерпретировал бы это так:

PHP 8 сделает так, чтобы он интерпретировался так:

Более строгие проверки типов для арифметических и побитовых операторов

До PHP 8 можно было применять арифметические или побитовые операторы к массивам, ресурсам или объектам. Это больше не возможно и выдаст TypeError:

Имена в пространствах имен являются одним токеном rfc

PHP используется для интерпретации каждой части пространства имен (разделенной обратной косой чертой \) как последовательности токенов. Этот RFC изменил это поведение, что означает, что теперь в пространствах имен можно использовать зарезервированные имена.

Более разумные числовые строки rfc

Система типов PHP пытается делать много умных вещей, когда встречает числа в строках. Этот RFC делает такое поведение более последовательным и понятным.

Более разумное сравнение чисел и строк rfc

Этот RFC исправляет очень странный случай в PHP, когда 0 == «foo» возвращает результат как true. Есть и другие крайние случаи, подобные этому, и этот RFC исправляет их.

Изменения подписи метода отражения

Три сигнатуры методов классов отражения были изменены:

В руководстве по обновлению указано, что если вы расширяете эти классы и по-прежнему хотите поддерживать как PHP 7, так и PHP 8, допускаются следующие подписи:

Стабильная сортировка rfc

До PHP 8 алгоритмы сортировки были нестабильны. Это означает, что порядок равных элементов не был гарантирован. PHP 8 изменяет поведение всех функций сортировки на стабильную сортировку.

Стабильные сортировки полезны, прежде всего, при сортировке сложных данных только по некоторой части этих данных. Рассмотрим этот пример:

Этот код сортирует пользователей по возрасту. В настоящее время порядок пользователей в одной возрастной группе будет произвольным. При стабильной сортировке исходный порядок объектов будет сохранен. Например, если $users уже был отсортирован по имени, то $users теперь будут отсортированы по возрасту первым и по имени вторым. Конечно, в этом случае можно было бы явно отсортировать по двум критериям:

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

Помимо предоставленных пользователем функций сравнения, другой случай, когда стабильная сортировка часто желательна, — это функция asort(), которая сортирует по значению, но сохраняет ключи.

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

Этот RFC предлагает сделать все функции сортировки PHP стабильными. Сюда входят rsort, usort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort, а также соответствующие методы ArrayObject.

Неустранимая ошибка для несовместимых сигнатур методов rfc

Ошибки наследования из-за несовместимых сигнатур методов в настоящее время либо генерируют фатальную ошибку, либо предупреждение в зависимости от причины ошибки и иерархии наследования.

Если класс реализует интерфейс, несовместимые сигнатуры методов вызывают фатальную ошибку. Согласно документации Object Interfaces:

В PHP 7.4 приведенный выше код вызовет следующую ошибку:

Функция в дочернем классе с несовместимой подписью выдала бы предупреждение.

В PHP 7.4 приведенный выше код просто выдал бы предупреждение:

Теперь этот RFC предлагает всегда выдавать фатальную ошибку для несовместимых сигнатур методов. В PHP 8 код, который мы видели ранее, подсказывал следующее:

Во время разработки PHP 7. * было добавлены предупреждения об устаревании, которые теперь полностью удалены в PHP 8.

  • Устаревшее в PHP 7.2
  • Устаревшее в PHP 7.3
  • Устаревшее в PHP 7.4
  • Поделиться

Веб-разработчик со стажем программирования более 10 лет, всегда в процессе учебы и созидания.

PHP 8 — что нового в 8-ой версии php

Оглавления для удобной навигации по новым PHP 8.0 фичам (клик для перехода):

  1. Новые строковые функции
  2. Named Arguments
  3. Constructor property promotion
  4. Match expression
  5. Union types
  6. Attributes

PHP 8.0 Что нового: новые фичи php 8

1. Новые нативные функции для работы со строками

str_contains — для проверки есть ли подстрока в строке.

str_contains(string $haystack, string $needle): bool

str_starts_with, str_ends_with — функции для проверки "начинается ли строка с" и "заканчивается ли строка на"

str_starts_with(string $haystack, string $needle): bool
str_ends_with (string $haystack, string $needle): bool

2. Named arguments

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

В PHP < 8 мы бы вызывали так:

3. "Constructor property promotion" или просто "Constructor promotion"

Для меня, это одна из самых полезных фичей новой версии, которая позволяет экономить время разработки и рефакторинга.

Прямо в конструкторе можно указать модификтор доступа любого аргумента будь то private / protected / public , тогда property с таким именем можно нужно не объявлять вовсе. Как можно заметить, никакое присваивание в теле конструктора тоже не нужно, наличие модификатора доступа в конструкторе PHP 8.0 — автоматически создает проперти с именем, равным именем переменной и присваивает параметр в property.

В версиях PHP < 8 мы бы писали так (почти в 3 раза! больше кода!):

Используя DI, autowiring и constructor promotion — теперь сплошное удовольствие при подстановке зависимостей в сервис.

4. match expression

Match expression (см. https://www.php.net/manual/en/control-structures.match.php) — более емкий и читаемый вариант для оператора switch . Есть и отличие от switch : match всегда использует строгое сравнение. Отпадает необходимость в break.

Итого про match:

не любой switch можно заменить на match . Вместо простых switch можно использовать более читаемый и емкий match .

5. Union types

В этом случае в проперти $this->city можно будет присовить только типы false, null или объект City.

То, что раньше описывали c помощью phpdoc /** @var false|null */ теперь можно легально описать языковой конструкцией.

Кроме types properties, Union types можно использовать как в аргументах, так и в возвращаемых значениях.

Лучше не увлекаться Union types в PHP, так как все таки это не однозначность в типах.

6. Attributes PHP 8.0 feature

Аттрибуты — фича, которая позволяет использовать языковую конструкцию для добавления мета-данных к классу, функции, проперти. Проблема, которую решают аттрибуты — зависимость кода от PHPDoc комментариев, что очень широко используется в doctrine, symfony и тд. Теперь выполнение кода может зависеть от аттрибутов:) которые являются языковой конструкцией, то есть это более "стандартизированный" подход.

Аттрибуты объявляются с помощью #[ и ]

По поводу синтаксиса аттрибутов было много споров. В PHP все что начинается с # является комментарием. Это значит, что синтаксис аттрибутов #[ не будет вызывать синтаксическую ошибку на более ранних версиях PHP (до PHP 8.0). То есть код с аттрибутами запустится и на более ранних версиях языка, чем когда аттрибуты стали поддерживаться (с PHP 8.0). Другой вопрос, станет ли код на ранних версиях работать ожидаемо:)

Дата добавления: год назад

Что нового в PHP 8 — улучшения и возможности, из-за которых стоит переходить на эту версию

23.06.21 PHP 597

Язык PHP за время своего существования прошел путь совершенствования, став из простого языка для построения веб-страниц мощным инструментом. PHP 8 приносит еще больше улучшений и возможностей. Проделана большая работа по оптимизации – производительность PHP 8 стала выше. Также был улучшен синтаксис, а система типов стала более надежной. Обо всем подробнее ниже.

chto-novogo-v-php-8

Что нового в PHP 8

Краткий список новшеств, на которые стоит обратить внимание:

универсальные типы (union type), позволяющие для объединенных типов заменить аннотации PHPDoc;

именованные аргументы, что означает возможность передавать только необходимые аргументы и в любом порядке, просто указывая имена аргументов;

определение свойств в конструкторе, которое позволяет использовать меньше кода как для определения, так и для инициализации свойств;

оператор nullsafe (?->), помогает избежать проверки на null. Достаточно использовать последовательность вызовов с этим оператором. Возвращается null, если один из элементов в проверяемой последовательности вернет null;

добавлены атрибуты, что означает возможность взамен аннотаций PHPDoc использовать структурные метаданные со стандартным синтаксисом PHP;

добавлено выражение match, похожее на switch, но match является выражением со строгой проверкой типов и его результат может быть возвращён. Возможно использовать только однострочные выражения;

обработка ошибок согласованности типов для встроенных функций, что позволяет таким функциям теперь выдавать ошибки в случае неправильных типов аргументов;

JIT (компиляция Just-In-Time), что позволяет ускорить PHP примерно в 3 раза. Но такой прирост может быть получен не всегда, необходимо учитывать тип веб-приложения. Без использования этого новшества, PHP 8 равен по скорости PHP 7.4;

изменения в сравнении строк и чисел. Если происходит сравнение со строкой, содержащей число, будет использовано сравнение чисел, иначе будет выполнено преобразование и строчное сравнение;

прочие улучшения в системе типов, обработке ошибок и согласованности данных (консистентности).

Улучшения в системе типов и обработке ошибок PHP 8

Рассмотрим это более детально. Сделано следующее:

появились строгие проверки типов для некоторых операторов;

подавления ошибок оператором @ для фатальных ошибок больше не происходит;

добавлен новый тип mixed;

стало возможным наследование с методами private;

тип static может быть возвращаемым;

добавлена проверка методов для абстрактных трейтов;

у магических методов появились правильные сигнатуры;

проведена переработка предупреждений движка;

теперь выводится фатальная ошибка в случае, если сигнатуры методов несовместимы;

для OpenSSL, Curl, XMLWriter, Gd, Sockets и расширения XML теперь вместо ресурсов используются непрозрачные объекты;

добавлены типы для функций Email thread.

Изменения в синтаксисе PHP 8

Синтаксис PHP 8 также был улучшен, среди таких улучшений можно выделить следующее:

стало возможным использовать запятую в конце списков параметров и в списке use замыканий, как ранее это можно было делать для массивов;

для блока catch можно не указывать переменную;

синтаксис некоторых переменных изменен;

все имена в пространстве имен теперь рассматриваются как отдельный токен;

throw теперь является выражением;

для объектов стало возможным использовать ::class.

Новые классы, функции и интерфейсы PHP 8

Эти нововведения помогут сделать работу с PHP еще более удобной и производительной:

добавлен класс Weak Map (коллекция, которая принимает объекты в качестве ключей и служит для создания кешей данных, полученных из объекта, которым не нужно существовать дольше, чем сам объект);

добавлен интерфейс Stringable (класс, реализующий метод __toString());

новая функция str_contains (определяет, содержит ли строка заданную подстроку);

str_starts_with (проверяет, начинается ли строка с заданной подстроки);

str_ends_with (проверяет, заканчивается ли строка заданной подстрокой);

fdiv (функция для деления одного числа на другое по спецификации IEEE 754);

get_debug_type (получает тип переменной для отладки);

get_resource_id (получение целочисленного идентификатора для указанного ресурса);

объектно-ориентированная функция token_get_all (выполняет разбиение переданного кода на PHP-лексемы);

новшества для DOM, новые API для обхождения и обработки.

Рассмотренные возможности и улучшения позволят разрабатывать на PHP гораздо продуктивнее и удобнее. Если проект использует старую версию, возможно стоит переходить на PHP 8 – это позволит увеличить производительность, безопасность и удобство при разработке проекта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *