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

PHP 8.3 – очередное обновление языка, которое делает разработку более удобной, а код – безопаснее и быстрее. В этой версии появилось несколько ключевых улучшений: типизированные константы классов, встроенная проверка JSON, новый атрибут #[Override], динамическое получение значений констант классов и ряд оптимизаций. Разберёмся, зачем всё это нужно, как использовать новые функции и что важно учесть при обновлении.

Типизированные константы классов

Раньше в PHP нельзя было жёстко задавать тип константы внутри класса. Это создавало проблемы при статическом анализе и увеличивало риск ошибок. Теперь можно явно указывать тип:

class Config {
    public const string DATABASE_HOST = 'localhost';
    public const int MAX_CONNECTIONS = 100;
}

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

class InvalidConfig {
    public const int MAX_CONNECTIONS = 'not a number'; // Ошибка!
}

Что это даёт:

  • Улучшает читаемость кода.
  • Снижает вероятность неожиданных ошибок.
  • Работает лучше с IDE и статическим анализом.

Динамическое получение значений констант классов

Раньше, чтобы получить значение константы через переменную, приходилось изобретать костыли. Теперь это делается просто:

class Status {
    public const SUCCESS = 'ok';
    public const ERROR = 'fail';
}

$constName = 'SUCCESS';
echo Status::{$constName}; // ok

Как это работало раньше:

class Status {
    public const SUCCESS = 'ok';
    public const ERROR = 'fail';
}

$constName = 'SUCCESS';
echo constant('Status::' . $constName); // ok

Раньше приходилось использовать constant() или ReflectionClass. Теперь всё стало проще и удобнее.

Проверка валидности JSON: json_validate()

До PHP 8.3 не было удобного способа проверить, является ли строка валидным JSON, не вызывая json_decode() и не проверяя json_last_error(). Теперь есть json_validate(), которая выполняет только проверку и работает быстрее.

$jsonValid = '{"name": "PHP", "version": 8.3}';
$jsonInvalid = '{name: "PHP", version: 8.3}'; // Ошибка - отсутствуют кавычки у ключей

if (json_validate($jsonValid)) {
    echo "Корректный JSON"; // Выведет: Корректный JSON
} else {
    echo "Ошибка в JSON";
}

if (json_validate($jsonInvalid)) {
    echo "Корректный JSON";
} else {
    echo "Ошибка в JSON"; // Выведет: Ошибка в JSON
}

Чем лучше:

  • Работает быстрее, чем json_decode(), так как не преобразует данные.
  • Простая и понятная логика работы.

Новый атрибут #[Override]

В больших проектах легко пропустить случайное изменение имени метода в родительском классе, что приведёт к неожиданному поведению. Новый атрибут #[Override] позволяет явно указать, что метод переопределяет родительский:

class ParentClass {
    public function doSomething(): void {}
}

class ChildClass extends ParentClass {
    #[Override]
    public function doSomething(): void {} // Всё в порядке

    #[Override]
    public function anotherMethod(): void {} // Ошибка! Родительского метода нет
}

Что это даёт:

  • Упрощает поддержку кода в командах.
  • Предотвращает случайные ошибки при рефакторинге.

Улучшения работы с итераторами массивов

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

$array = [1, 2, 3];
$iterator = new ArrayIterator($array);
$cachedIterator = new CachingIterator($iterator);

foreach ($cachedIterator as $item) {
    echo $item . " ";
}

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

$iterator = new CachingIterator(new ArrayIterator(range(1, 1000000)));
foreach ($iterator as $item) {
    // Первое выполнение — стандартная итерация
}

foreach ($iterator as $item) {
    // Второй проход использует кешированные данные, ускоряя выполнение
}

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

Улучшения производительности

PHP 8.3 включает несколько серьёзных оптимизаций, которые делают код быстрее и эффективнее. Некоторые из ключевых улучшений:

  • Ускорена работа JIT-компилятора – например, некоторые арифметические операции теперь выполняются быстрее.
  • Оптимизирована работа со строками – например, конкатенация строк стала быстрее за счёт более эффективного управления памятью.
  • Снижена нагрузка на GC (Garbage Collector) – уменьшено число циклов сборки мусора, что ускоряет работу скриптов.

Устаревшие и удалённые функции

Как и в каждом обновлении, некоторые старые функции были признаны устаревшими или удалены. Основные изменения:

  • utf8_encode() и utf8_decode() больше не рекомендуются. Вместо них следует использовать mb_convert_encoding()
  • Полностью удалён mhash(), заменён на hash_* функции.
  • Библиотека libmysql больше не поддерживается, теперь используется только mysqlnd.

Как обновиться и что учитывать

Проверка кода на совместимость

Перед обновлением важно проверить код на совместимость с PHP 8.3. Для этого можно использовать статический анализатор PHPCompatibility для PHP_CodeSniffer:

composer require --dev squizlabs/php_codesniffer dealerdirect/phpcodesniffer-composer-installer
vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 8.3 .

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

Так же перед обновлением с PHP 8.2 на 8.3:

  1. Проверьте зависимости – убедитесь, что используемые библиотеки и фреймворки поддерживают PHP 8.3.
  2. Запустите тесты – если у вас есть unit-тесты, обязательно их прогоните.
  3. Проверьте устаревшие функции – используя php -m и composer outdated, чтобы найти возможные несовместимости.

Заключение

PHP 8.3 продолжает делать язык более удобным и безопасным. Самые заметные улучшения – это типизированные константы классов, встроенная проверка JSON, новый атрибут #[Override] и упрощённая работа с константами классов. Обновление не требует кардинального переписывания кода, но приносит важные улучшения.

Стоит ли переходить на PHP 8.3? Если ваш проект активно развивается и вы хотите писать более удобный и безопасный код – определённо да.

Официальная документация: PHP 8.3 Release Notes

Рубрики: PHP

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

Bitrix: проверка авторизации пользователя

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

Bitrix получить директорию шаблона

В статье приводится пример кода получения директории шаблона компонента

Использование chatGpt: генерация шаблона письма

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

Форматирование чисел на javascript

В статье приводится пример кода для форматирования чисел на javascript с различными наборами параметров форматирования.

Bitrix удалить директорию

В статье даны примеры использования метода \Bitrix\Main\IO\Directory::deleteDirectory() для удобного удаления директории.

CSS магия: стилизации элементов на основе нумерации

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

Комментарии

Комментариев пока нет
Данный сайт использует файлы cookies. Продолжая просмотр сайта, вы соглашаетесь с использованием файлов cookies.
ОК