PHP 8.2: Что ожидать (Руководство для разработчиков – Обновлено)

by Jason Cosper
PHP 8.2: Что ожидать (Руководство для разработчиков – Обновлено) thumbnail

Ожидается, что PHP 8.2 будет выпущен в ноябре этого года, при этом последняя стабильная версия – PHP 8.1.5. Хотя процесс еще на ранней стадии, уже появились разнообразные отзывы касательно совместимости PHP 8.2 с WordPress core, plugin и theme.

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

В этом посте мы рассмотрим последние версии PHP. Затем мы расскажем о нововведениях в PHP 8.2 и обсудим график выпуска. Давайте начнем!

Обзор версий PHP

PHP является основным языком программирования WordPress. Он играет важную роль в преобразовании данных из вашей базы данных в HTML веб-страницы для посетителей вашего сайта.

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

На данный момент WordPress рекомендует использовать как минимум PHP 7.4. Старые версии PHP больше не получают активной поддержки для обновлений безопасности и исправлений ошибок. Поэтому обновление до последней стабильной версии PHP может привести к повышению безопасности сайта, улучшению производительности и более высокому уровню поддержки (мы подчеркиваем стабильную, поскольку часть из 60 000+ Plugins/plugin WordPress пока не полностью совместимы с PHP 8.0, поэтому к таким обновлениям следует подходить с осторожностью).

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

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

  • Именованные параметры
  • Синтаксис сопоставления
  • Объединенные типы
  • Продвижение свойств конструктора
  • JIT (влияет на выполнение исходного кода PHP)

Через год появилась PHP 8.1, последняя основная версия PHP. Это обновление включает в себя значительные функции, такие как:

  • Пересечение типов
  • Свойства только для чтения
  • Перечисления
  • Файберы
  • Тип возвращаемого значения never

Следить за последними версиями PHP может помочь повысить производительность и безопасность вашего сайта. Однако важно знать, какие изменения ожидать перед обновлением. Если вы заинтересованы в тестировании текущего состояния PHP 8.2, вы можете сделать это через GitHub.

Что нового в PHP 8.2

Ожидается, что PHP 8.2 будет выпущен к концу 2022 года. Вот текущий график выпуска, с общей доступностью (GA) запланированной на 24 ноября 2022 года:

  • 9 июня: Alpha 1
  • 23 июня: Alpha 2
  • 7 июля: Alpha 3
  • 19 июля: Заморозка функционала
  • 21 июля: Beta 1
  • 4 августа: Beta 2
  • 18 августа: Beta 3
  • 1 сентября: Кандидат на выпуск 1
  • 15 сентября: Кандидат на выпуск 2
  • 29 сентября: Кандидат на выпуск 3
  • 13 октября: Кандидат на выпуск 4
  • 27 октября: Кандидат на выпуск 5
  • 10 ноября: Кандидат на выпуск 6
  • 24 ноября: GA

Согласно официальной документации на сайте PHP, должно появиться несколько новых функций и устаревших функций. Давайте рассмотрим некоторые из них!

Типы дизъюнктивной нормальной формы (DNF)

PHP 8.2 будет внедрять новую функцию Дизъюнктивная нормальная форма (DNF) типов. DNF – это стандартизированный способ организации булевых выражений — конкретно, в виде серии AND, объединенных OR. Когда DNF применяется к объявлениям типов, это позволяет стандартно описывать комбинированные объединенные и пересекающиеся типы, которые может обрабатывать парсер.

Новая функция mysqli_execute_query и метод mysqli::execute_query

Запуск параметризованных запросов MySQLi станет проще в PHP 8.2, благодаря новой функции mysqli_execute_query($sql, $params) и методу mysqli::execute_query.

Это ещё больше уменьшит сложность использования параметризованных запросов, что в свою очередь облегчит разработчикам переход от mysqli_query() а также от опасной/рискованной экранизации пользовательских значений.

Извлечение свойств перечисления в константных выражениях

Согласно RFC, «Этот RFC предлагает разрешить использование ->/?-> для извлечения свойств перечислений в постоянных выражениях. Основная мотивация этого изменения заключается в возможности извлечения свойств имени и значения в местах, где объекты перечислений не допускаются, например, в ключах массивов.»

Новое случайное расширение

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

Расширение random поставляется вместе с PHP, и нет опции конфигурации на этапе компиляции или выполнения, чтобы отключить расширение random. Расширение random всегда будет доступно в PHP 8.2 и более поздних версиях.

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

PHP 8.2 добавляет новую функцию в расширение Curl под названием curl_upkeep. Функция curl_upkeep вызывает curl_easy_upkeep() в libcurl, который является базовой библиотекой C, используемой расширением PHP Curl.

Функция curl_upkeep() выполняет работу, которая поддерживает живой соединение Curl. Однако не каждый тип соединения, с которым интегрируется Curl, поддерживает поддержание соединения. В настоящее время это поддерживают только соединения HTTP/2.

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

ini_parse_quantity — это новая функция, которая будет добавлена в PHP в версии PHP 8.2. Она анализирует любой размер данных, распознаваемый значениями PHP INI (такими как 56K, 256M или 1G), затем возвращает размер данных в байтах. Это может быть полезно при анализе существующих или предоставленных значений INI в PHP-приложении. Однако она не распознает суффиксы IEC для размеров данных, такие как MB, MiB или GB, и не подходит для преобразования стандартных значений размера данных в байты.

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

PHP 8.2 включит новую функцию под названием memory_reset_peak_usage. Она сбросит пиковое использование памяти, возвращаемое функцией memory_get_peak_usage.

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

Получайте контент прямо в свой почтовый ящик

Подпишитесь сейчас, чтобы получать все последние обновления прямо в свой почтовый ящик.

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

Введенные в PHP 8.1, свойства только для чтения будут расширены в PHP 8.2 для добавления синтаксического сахара, так что все свойства класса станут только для чтения одновременно:

readonly class Post
{
public function __construct(
public string $title,
public Author $author,
public string $body,
public DateTime $publishedAt,
) {}
}

Это предотвратит добавление динамических свойств к классам.

Null, True и False как самостоятельные типы

В PHP 8.2 тип возврата false будет доступен как отдельный тип, а не только как строгий объединенный тип, когда происходит ошибка, что уже возможно:

function alwaysFalse(): false
{
return false;
}

То же самое верно и для типа null. Например, как отдельный тип, в отличие от ранее, NullPost::getAuthor() теперь сможет возвращать только null.

PHP 8.2 также позволяет использовать true в качестве отдельного типа.

Устаревание динамических свойств

Динамические свойства будут устаревать в PHP 8.2, что приведет к возникновению ErrorException к PHP 9.0. Эти свойства устанавливаются в объекте:

class Post
{
public string $title;
}

// …

$post->name = 'Имя';

Динамические свойства обеспечивают гибкость при создании классов (например, объектов значений) без строгого объявления класса. Их устаревание, скорее всего, станет проблемой для разработчиков, которые полагаются на динамические свойства, поскольку это будет стимулировать их к использованию статического анализа. По этой причине некоторые разработчики опасаются этого изменения с PHP 8.2.

Тем не менее, классы, использующие __get и __set, по-прежнему будут поддерживать динамические свойства, как и объекты stdClass.

В качестве альтернативы, разработчики могут использовать новый #[AllowDynamicProperties]attribute, объявленный в глобальном пространстве имен, в классах для этих свойств:

#[AllowDynamicProperties]
class User() {}
$user = new User();
$user->foo = 'bar';

Хотя это не рекомендуется, другой вариант — отключить предупреждения об устаревании.

Новый /n модификатор

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

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

Скрыть параметры в трассировках

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

Однако иногда трассировки стека могут содержать конфиденциальную информацию, такую как имена пользователей и пароли. PHP 8.2 будет включать #[SensitiveParameter] атрибут, который предотвратит включение этой информации в трассировки стека, когда что-то пойдет не так:

function test(
$foo,
#[SensitiveParameter] $bar,
$baz
) {
throw new Exception('Ошибка');
}

test('foo', 'bar', 'baz');

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

Устаревание интерполяции строки ${}

Существует несколько способов встраивания переменных в строки с помощью PHP. Однако PHP 8.2 объявит устаревшими два метода. Первый — использование ${} в строках:

"Привет ${world}";

Второй способ использует ${} (переменные переменные):

"Привет ${(world)}";

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

Устаревание частично поддерживаемых вызываемых объектов

Еще одно устаревшее изменение будет с частично поддерживаемыми вызываемыми. Существует несколько способов создания вызываемого в PHP. Его можно вызвать либо с параметрами, либо без них с помощью синтаксиса $callable(), user_call_func(/a_array), или используя функцию с колбэком.

Устаревшие вызываемые шаблоны включают следующие:

$callable = "self::method";
$callable = "parent::method";
$callable = "static::method";
$callable = ["self", "method"];
$callable = ["parent", "method"];
$callable = ["static", "method"];
$callable = ["MyClass", "MyParentClass::myMethod"];
$callable = [new MyClass(), "MyOtherClass::myMethod"];

Начиная с PHP 8.2, вызов любой из вышеупомянутых функций приведет к следующему уведомлению об устаревании:

class Test {
public static function myMethod(): void {
echo "Called";
}
public static function call(): void {
$callable = 'self::myMethod';
call_user_func($callable);
}
}
$callable = Test::call();
// "Called";

Однако передача этих вызываемых объектов функции is_callable или их использование с типами параметров вызываемых объектов не вызовет сообщение о устаревании. Чтобы избежать уведомления об устаревании, разработчики могут вместо этого преобразовать ключевые слова parent, self и static в вызываемом коде в соответствующие имена классов, используя магический метод::class.

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

MySQLi больше не может быть скомпилирован с libmysql

В прошлом PHP поддерживал две библиотеки для подключения к базам данных MySQL: mysqlnd и libmysql. Начиная с PHP 5.4, mysqlnd стала библиотекой по умолчанию. Однако возможна компиляция MySQLi через расширения.

Начиная с PHP 8.2, компиляция расширения MySQLi с использованием libmysql не будет поддерживаться. Попытка это сделать приведет к ошибке конфигурации:

./configure --with-mysqli=FOO

Связывание mysqli с внешней библиотекой больше не поддерживается

Это вряд ли вызовет какие-либо значительные ошибки для разработчиков. Однако две наиболее важные функции, поддерживаемые libmysql, которые не доступны в mysqlnd, это поддержка автоматического переподключения и аутентификации через LDAP и SASL.

Держите вашу версию PHP WordPress в актуальном состоянии

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

Фоновое изображение объявления

Идеальная среда разработки

Мы гарантируем, что ваш сайт будет быстрым, безопасным и всегда доступным, чтобы ваши посетители вам доверяли. Тарифы начинаются от $1.99/мес.

Выберите ваш тариф