PHP 8.3 будет выпущен как обычно в конце ноября 2023 года. В этом посте мы рассмотрим все функции, улучшения производительности, изменения и устаревший функционал
Новая функция json_validate rfc
В PHP 8.3 добавлена новая функция json_validate(), которая возвращает true или false в том случае, если заданная строка является допустимой строкой JSON. До PHP 8.3 единственным способом определить, является ли заданная строка допустимой строкой JSON, была попытка ее декодирования и проверка наличия каких-либо ошибок. Новая функция json_validate() использует тот же базовый синтаксический анализатор JSON, что и PHP, но потребует меньше памяти:
json_validate('[1, 2, 3]'); //true
json_validate('{1, 2, 3]'); //false
Динамический доступ к константам класса и Enum rfc
До PHP 8.3 синтаксис доступа к константам класса типа ClassName::{$varName} был запрещен и приводил к синтаксической ошибке:
Parse error: syntax error, unexpected token ";", expecting "(" in ... on line ...
То же ограничение применялось и к Enum, где было невозможно получить элемент Enum динамически:
Parse error: syntax error, unexpected token "->", expecting "(" in ``` on line ```
Теперь PHP 8.3 и более поздние версии поддерживают динамическое получение констант класса и объектов Enum с именем переменной:
class MyClass {
public const MY_CONST = 42;
}
$constName = 'MY_CONST';
echo MyClass::{$constName};
Функция gc_status() возвращает дополнительную информацию GC rfc
Функция gc_status() возвращает статистику сборщика мусора PHP, например, работает ли сборщик мусора, защищен ли сборщик мусора и размер буфера. Эта информация может быть полезна при отладке долго работающих PHP-приложений для обнаружения и оптимизации использования памяти.
var_dump(gc_status());
Новый метод \Random\Randomizer::getBytesFromString rfc
Класс \Random\Randomizer в PHP 8.3 поддерживает новый метод getBytesFromString, который возвращает последовательность случайных чисел запрошенной длины (параметр $length), содержащую только байты из запрошенной последовательности байтов (параметр $string).
namespace Random;
class Randomizer {
// ...
public function getBytesFromString(string $string, int $length): string { }
}
$rng = new Random\Randomizer();
$crockfordAlphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
$rng->getBytesFromString($crockfordAlphabet, 5); // "5YH8T"
Новые методы \Random\Randomizer::getFloat() и nextFloat() rfc
RFC добавляет новые методы в расширении Random, генерирующие случайное значение. \Random\Randomizer::getFloat()\Random\Randomizer::nextFloat(). Например если необходимо сгенерировать случайное число float между 0 <и < 10 и в диапазоне 0 <= и < 1:
$rng = new Random\Randomizer();
$rng->getFloat(0, 10, \Random\IntervalBoundary::OpenOpen); // 9.3835746900717
...
$rng = new Random\Randomizer();
$rng->nextFloat(); // 0.21185336351144
unserialize(): Вывод E_WARNING ошибок вместо E_NOTICE
До версии PHP 8.3 передача недопустимой строки в функцию unserialize() выдавала всего лишь уведомления PHP ( E_NOTICE) в определенных случаях, например, при синтаксических ошибках в сериализованной строке. Начиная с PHP 8.3 выдается предупреждение E_WARNING. Кроме того, некоторые условия ошибки так же изменились в функции serialize(), чтобы выдать E_WARNING:
unserialize("invalid-string");
- PHP Notice: unserialize(): Error at offset 0 of 14 bytes //было
+ PHP Warning: unserialize(): Error at offset 0 of 14 bytes //стало
В идеале невозможность десериализации данной строки должна быть серьезной ошибкой и вызывать исключение. Однако для обеспечения обратной совместимости и упрощения путей обновления уровень ошибок в PHP 8.3 был увеличен, а в будущем возможно его обновление для создания исключений.
Что думаешь?