Вышел PHP 8.3 с типизированными константами классов, функцией json_validate и многим другим

Источник: «PHP 8.3 is released with typed class constants, a json_validate function, and more»
Команда PHP выпустила PHP 8.3, в котором появились типизированные константы классов, функция json_validate(), динамическое получение константы класса, атрибут #[Override] и многое другое.

Команда PHP выпустила PHP 8.3, в котором появились типизированные константы классов, функция json_validate(), динамическое получение константы класса, атрибут`#[Override] и многое другое.

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

В PHP 8.2 по-прежнему нельзя было объявлять типы константы (const), что могло привести к путанице или неясности в отношении типа, с которым вы работаете:

interface I {
const TEST = "Test"; // Мы можем наивно предположить, что константа TEST всегда является строкой
}

class Foo implements I {
const TEST = []; // Но это может быть и массив...
}

class Bar extends Foo {
const TEST = null; // Или null
}

Вот пример того, как выглядят типизированные константы в PHP 8.3:

interface I {
const string TEST = E::TEST; // I::TEST также является строкой
}

class Foo implements I {
use T;

const string TEST = E::TEST; // Foo::TEST также должен быть строкой
}

class Bar extends Foo {
const string TEST = "Test2"; // Bar::TEST также должен быть строкой, но его значение может меняться
}

// Пример ошибки

// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string
class Buzz implements I {
const string PHP = [];
}

Функция json_validate()

Для проверки JSON в PHP необходимо либо установить флаг JSON_THROW_ON_ERROR, либо использовать json_last_error, либо просто проверить на null при вызове json_decode():

json_decode(json: '{"foo": "bar}', flags: JSON_THROW_ON_ERROR);

// JsonException Control character error, possibly incorrectly encoded.

Начиная с версии PHP 8.3, можно также проверять JSON с помощью функции json_validate():

// Valid
json_validate('{"framework": "Laravel"}'); // true

// Invalid
json_validate('{"framework": "Laravel}'); // false

json_last_error_msg(); // Control character error, possibly incorrectly encoded
json_last_error(); // 3

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

В PHP >= 8.2 динамическое получение значения константы класса было возможно только с помощью функции constant(). В этом случае возникала синтаксическая ошибка:

class Framework {
const NAME = 'Laravel';
}

$name = 'NAME';

// Этого можно добиться с помощью функции constant()
constant(Framework::class . '::' . $name); // Laravel

// Ниже приведена синтаксическая ошибка в >=v8.2.0
echo Framework::{$name};
// ParseError syntax error, unexpected token ";", expecting "(".

Начиная с версии PHP 8.3, появилась возможность динамического доступа к константам класса,

class Framework {
const NAME = 'Laravel';
}

$name = 'NAME';

// Syntax error in <= v8.2.0
echo Framework::{$name}; // Laravel

Резервное значение для переменных окружения в INI-файлах

Одним из моих любимых дополнений в PHP 8.3 является предоставление значения по умолчанию при использовании переменных окружения для определения настроек INI. Это упростит использование значений по умолчанию в Docker без необходимости указывать значения по умолчанию в виде блоков ENV в Dockerfile. Я уверен, что существует множество примеров использования, которые будут упрощены благодаря этому.

Допустим, например, что вы хотите разрешить значение DRUPAL_FPM_PORT ENV для настройки INI-значения для пула www FPM:

error_log = syslog
daemonize = false

[www]
listen = localhost:${DRUPAL_FPM_PORT}

DRUPAL_FPM_PORT должен быть определён, и никакого значения по умолчанию не было! Теперь можно выполнить следующие действия, которые должны показаться знакомыми для сценария bash/shell:

[www]
listen = localhost:${DRUPAL_FPM_PORT:-9000}

Представьте себе, что в составе Dockerfile для разработки поставляется файл xdebug.ini с разумными значениями по умолчанию, но при этом позволяющий разработчикам переопределять значения по своему усмотрению.

Дополнения Randomizer

В PHP 8.3 появились дополнения к Randomizer, в том числе новый метод getBytesFromString(), удобный для получения случайных байт из исходной строки:

$randomizer = new \Random\Randomizer();

printf(
"%s.example.com",
$randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16)
);

// 3zsw04eiubcf82jd.example.com


// Генерация случайного кода для многофакторной аутентификации
$randomizer = new \Random\Randomizer(new \Random\Engine\Secure());

echo implode('-', str_split($randomizer->getBytesFromString('0123456789', 20), 5));

// 11551-80418-27047-42075

Дополнительная информация

Чтобы ознакомиться с новыми возможностями, посетите страницу анонса релиза PHP 8.3.0, где приведены примеры до/после выхода PHP 8.3. Не забудьте также ознакомиться с информацией об устаревшей функциональности и нарушениях обратной совместимости.

Дополнительные материалы

Предыдущая Статья

Семантические горизонтальные списки

Следующая Статья

PHP 8.3 что нового. Изменения и новый функционал.