Вышел 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. Не забудьте также ознакомиться с информацией об устаревшей функциональности и нарушениях обратной совместимости.