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:
- Проверьте зависимости – убедитесь, что используемые библиотеки и фреймворки поддерживают PHP 8.3.
- Запустите тесты – если у вас есть unit-тесты, обязательно их прогоните.
- Проверьте устаревшие функции – используя
php -m
иcomposer outdated
, чтобы найти возможные несовместимости.
Заключение
PHP 8.3 продолжает делать язык более удобным и безопасным. Самые заметные улучшения – это типизированные константы классов, встроенная проверка JSON, новый атрибут #[Override]
и упрощённая работа с константами классов. Обновление не требует кардинального переписывания кода, но приносит важные улучшения.
Стоит ли переходить на PHP 8.3? Если ваш проект активно развивается и вы хотите писать более удобный и безопасный код – определённо да.
Официальная документация: PHP 8.3 Release Notes