opened image

Обзор PHP 8.2: нововведения, устаревшие функции и исправления багов

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

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

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

 

Новые функции в PHP 8.2

 

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

Типы свойств классов: readonly

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

Пример использования:

class User {

    public readonly string $name;



    public function __construct(string $name) {

        $this->name = $name;

    }

}



$user = new User("Alice");

// $user->name = "Bob"; // Ошибка: свойство только для чтения

Обзор PHP 8.2: нововведения

Преимущества:

  • Улучшает читаемость и поддержку кода.

  • Улучшение инкапсуляции данных.

  • Исключает случайные изменения критичных данных.

  • Снижение ошибок, связанных с изменением данных в процессе выполнения программы.

 

Улучшенная поддержка метаданных

 

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

Пример:

#[Attribute]

class Route {

    public function __construct(public string $path) {}

}



#[Route('/home')]

class HomeController {}

Обзор PHP 8.2: нововведения-1

 

Работа с флагами состояния

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

 

Динамические свойства объявлены устаревшими

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

До PHP 8.2:

​
class User {}

$user = new User();

$user->name = "Alice"; // Работает



​

 

После PHP 8.2:

class User {}

$user = new User();

$user->name = "Alice"; // Предупреждение: создание динамического свойства запрещено

Обзор PHP 8.2: нововведения-2

Решение: Используйте строгие декларации свойств:

class User {

    public string $name;

}

Обзор PHP 8.2: нововведения-3

Разрешение null в константных выражениях

С появлением PHP 8.2 появилась возможность применять null в константных выражениях, что повышает гибкость объявлений.

Пример:

class Example {

    public const VALUE = null;

}

Обзор PHP 8.2: нововведения-4

Устаревшие функции и их замена

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

 

Перечень устаревших функций, удаленных или измененных в PHP 8.2

 

  1. Динамические свойства объектов
    Динамическое добавление свойств к объектам запрещено, если класс не использует атрибут #[AllowDynamicProperties].

  2. Устаревшие функции в стандартной библиотеке

  • mysqli::stmt_init() теперь считается устаревшим.

  • Использование функции utf8_encode() и utf8_decode() признано устаревшим, так как они были специфичны для кодировки ISO-8859-1.

  1. Изменения в поддержке типов
    Некоторые устаревшие подходы, например, использование смешанных типов в отдельных конкретных ситуациях, стали не актуальны.

 

Примеры устаревших функций и объяснение, чем их заменяют

  1. Динамические свойства объектов

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

До PHP 8.2:

class MyClass {}

$obj = new MyClass();

$obj->newProperty = "value"; // Это работало

Обзор PHP 8.2: нововведения-5

После PHP 8.2:
Необходимо либо использовать атрибут #[AllowDynamicProperties], либо определить все свойства в классе заранее:

#[AllowDynamicProperties]

class MyClass {}



$obj = new MyClass();

$obj->newProperty = "value"; // Работает только с атрибутом



// Рекомендуемый подход:

class MyClass {

    public string $newProperty;

}



$obj = new MyClass();

$obj->newProperty = "value"; // Без ошибок

Обзор PHP 8.2: нововведения-6

 

  1. utf8_encode() и utf8_decode()

Существует мнение, что эти опции устарели, потому что они работают только с кодировками ISO-8859-1 и UTF-8. В настоящее время советуют использовать расширение intl или функции mb_convert_encoding() в качестве замены.

До PHP 8.2:

echo utf8_decode("текст на русском"); // Работает, но устарело

 

После PHP 8.2:

echo mb_convert_encoding("текст на русском", "UTF-8", "ISO-8859-1"); // Современный подход

 

  1. mysqli::stmt_init()

Теперь рекомендуется использовать другие методы для инициализации запросов в MySQLi.

До PHP 8.2:

$mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->stmt_init();

$stmt->prepare("SELECT * FROM table WHERE id=?");

Обзор PHP 8.2: нововведения-7

После PHP 8.2:

$mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->prepare("SELECT * FROM table WHERE id=?");

Обзор PHP 8.2: нововведения-8

 

Рекомендации для системных администраторов и разработчиков

 

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

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

  3. Тестирование в изолированной среде
    Разверните копию приложения на тестовом сервере с PHP 8.2. Это поможет выявить ошибки до обновления рабочего сервера.

  4. Обновление зависимостей
    Проверьте, чтобы библиотеки и фреймворки, которые вы применяете, поддерживали версию PHP 8.2. Если потребуется, актуализируйте их посредством обновлений. 

  5. Использование современных методов
    Переходите на рекомендованные альтернативы устаревшим функциям, чтобы обеспечить стабильность и производительность.

Важность проверки кода на наличие устаревших функций

Игнорирование процесса диагностики может привести к непредвиденным программным ошибкам, особенно в проектах большого масштаба. Применение неактуальных функций способно:

  • Уменьшить эффективность.

  • Открыть уязвимости для атак.

  • Усложнить последующее обслуживание кода.

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

Пример проверки кода с помощью PHPStan:

phpstan analyse --level=max /path/to/project  

 

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

Устранение ошибок и повышение уровня безопасности

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

Ключевые исправления багов

  1. Исправление утечек памяти
    С помощью PHP 8.2 был устранен ряд утечек памяти, которые периодически возникали при использовании объектов и массивов в некоторых условиях. Данное обновление помогает минимизировать риск чрезмерного потребления ресурсов и повышает общую эффективность.

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

  3. Исправления в работе функций для строк и массивов
    Часть функционала, взаимодействующая со строками и массивами, была усовершенствована с целью обеспечения более прогнозируемого поведения. Среди прочего, к примеру, обработка пустых строк и массивов стала лучше, что сделало её более корректной.

  4. Исправления в обработке типов данных
    В работу механизма типизации внесены коррективы, устраняющие неправильное функционирование в непростых ситуациях, связанных с преобразованием типов.

Усовершенствование защиты

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

  2. Устранение уязвимостей в модуле OpenSSL
    Известные уязвимые места в реализации функционала для выполнения криптографических операций были устранены. Это усиливает безопасность соединений, использующих протоколы SSL/TLS.

  3. Безопасная работа с памятью
    Внедрена дополнительная диагностика для обеспечения правильного управления памятью, во избежание ситуаций с переполнением буфера и потребление памяти после её освобождения (use-after-free).

  4. Обновления в random API
    Обновленное API для производства случайных чисел предлагает значительно улучшенную защиту с точки зрения криптографии. Эта усовершенствованная безопасность особенно актуальна для создания токенов и других случайных данных.

Образец корректировки защиты

До PHP 8.2:
Функция filter_var() с флагом FILTER_VALIDATE_EMAIL некорректно обрабатывала некоторые граничные случаи. Это могло привести к пропуску недопустимых значений.

$email = "test@localhost";

var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); 

// До PHP 8.2: true, хотя это некорректный email

Обзор PHP 8.2: нововведения-9

После PHP 8.2:
Теперь данная опция полностью соответствует стандарту RFC и корректно отсекает недопустимые email-адреса.

$email = "test@localhost";

var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); 

// После PHP 8.2: false

Обзор PHP 8.2: нововведения-10

Пример улучшения безопасности

Процесс работы со случайными числами с применением нового Random\Randomizer:

use Random\Randomizer;

// Создаём объект Randomizer

$randomizer = new Randomizer();

// Генерация случайного числа в безопасном диапазоне

echo $randomizer->getInt(1000, 9999); // Например, 4673

// Генерация случайной строки

echo $randomizer->getBytes(16); // Например, "\x15\xa3\x4b..."

Обзор PHP 8.2: нововведения-11

Преимущества:

  • Генерация, которая защищена криптографически.

  • Упрощение взаимодействия с диапазонами чисел и строками.

Советы по актуализации PHP

  • Удостоверьтесь, что ваш код не имеет устаревших опций.

  • Используйте новые API для генерации случайных данных и работы с криптографией.

  • Обновляйте серверы до PHP 8.2, чтобы устранить уязвимости и получить доступ к исправлениям.

Рекомендации по переходу на PHP 8.2

Алгоритм действий для исправной актуализации

  1. Создайте резервные копии. Убедитесь, что у вас есть копии всех серверных данных и конфигураций.

  2. Проверьте совместимость кода. Используйте инструменты для анализа кода.

  3. Обновите среду разработки. Обновите локальную среду и протестируйте приложения.

Тестирование перед релизом

Используйте изолированные среды, такие как Docker:

docker run -d -p 8080:80 php:8.2-apache  

 

Средства и угрозы

  • Регулярно актуализируйте ваши библиотеки и модули.

  • Используйте мониторинговые средства, например, New Relic или Blackfire, чтобы оценить эффективность системы.

Заключение

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

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

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