Что нового в 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

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

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

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

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

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

Yii2 как получить путь к корню проекта

Узнайте, как правильно получить путь к корню проекта в Yii2 с помощью встроенных инструментов фреймворка.

От ChatGPT до Perplexity AI: нейросети, которые помогут в работе

Список полезных нейросетей для работы и творчества: ChatGPT, Deepseek, GigaChat и другие. Узнайте, какие инструменты помогут автоматизировать задачи, создавать контент и решать сложные проблемы. 

Основные команды Linux

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

Полезные библиотеки для web разработки

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

Комментарии

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