Релиз языка программирования PHP 8.3
После года разработки представлен релиз языка программирования PHP 8.3. Новая ветка включает серию новых возможностей, а также несколько изменений, нарушающих совместимость.
Ключевые изменения в PHP 8.3:
- Во время клонирования классов предоставлена возможность повторной инициализации свойств с атрибутом «readonly». Переопределение readonly-свойств допускается только внутри функции »__clone»:
readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // разрешено, несмотря на то, что свойство "createdAt" доступно в режиме только для чтения. } }
- Предоставлена возможность использования констант с указанием типа в классах, типажах и перечислениях:
class Foo { const string BAR = 'baz'; }
Добавлена поддержка атрибута »#[Override]», при помощи которого разработчик может информировать интерпретатор о том, что отмеченный метод переопределяет какой-то родительский метод. В случае если переопределения не будет интерпретатор выведет ошибку.
Изменена обработка отрицательных значений в качестве индекса массива. Например, при добавлении в пустой массив элемента с номером »-5» и добавлении ещё одного элемента, раньше второй элемент сохранялся с индексом »0», а начиная с версии PHP 8.3 будет сохраняться с индексом »-4».
$array = []; $array[-5] = 'a'; $array[] = 'b'; var_export ($array); // Было array (-5 => 'a', 0 => 'b') // Стало array (-5 => 'a', -4 => 'b')
- Добавлена возможность создания анонимных классов в режиме только для чтения:
$class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
- Добавлена функция json_validate () для быстрой проверки соответствия строки формату JSON без выполнения операций декодирования.
json_validate(string $json, int $depth = 512, int $flags = 0): bool
В класс Randomizer, предоставляющий высокоуровневый API для генерации псеводослучайных чисел и последовательностей, добавлены новые методы: getBytesFromString для формирования строки заданного размера, использующей в случайном порядке символы, присутствующие в другой строке; getFloat и nextFloat для генерации случайного числа с плавающей запятой, укладывающегося в указанный диапазон.
- Добавлена
возможность извлечения констант, используя синтаксис динамических классов:
class Foo { const BAR = 'bar'; } $name = 'BAR'; // Ранее для извлечения константы BAR нужно было вызывать constant(Foo::class . '::' . $name); // А теперь достаточно указать Foo::{$name};
Добавлена генерация отдельных исключений (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) в случае проблем, возникающих в операциях работы с датами и временем.
Улучшена обработка ошибок, возникающих в процессе разбора сериализированных данных в функции unserialize (). В случае проблем unserialize () теперь выдаёт код E_WARNING вместо E_NOTICE.
Внесены изменения в функцию range (). Обеспечена генерация исключения при попытке передачи объектов, ресурсов или массивов в переменных, определяющих границы диапазона, а также при указании отрицательного значения в параметре $step или неопределённого значения в любом параметре. Обеспечен вывод списка символов при указании строк вместо чисел (например, «range ('5', 'z')»).
Изменено поведение типажей со статическими свойствами, которые теперь переопределяют статические свойства, унаследованные из родительского класса.
Добавлены настройки для защиты от переполнения стека. В ini-файл добавлены директивы zend.max_allowed_stack_size и zend.reserved_stack_size, определяющие максимально разрешённый и зарезервированный размер стека. Программа будет завершаться ошибкой при приближении к исчерпанию стека, когда стек заполнен больше, чем на разницу между значениями zend.max_allowed_stack_size и zend.reserved_stack_size (выполнение будет остановлено не доводя ситуацию до возникновения segmentation fault). По умолчанию значение zend.max_allowed_stack_size выставлено в 0 (0 — размер определяется автоматически, для отключения ограничения можно выставить -1).
Добавлены новые POSIX-функции posix_sysconf (), posix_pathconf (), posix_fpathconf () и posix_eaccess ().
Добавлена функция mb_str_pad, представляющая собой аналог строковой функции str_pad (), рассчитанный на работу с многобайтовыми кодировками, такими как UTF-8.
- Разрешено создание замыканий из методов и передачи именованных аргументов в эти замыкания.
$test = new Test(); $closure = $test->magic(...); $closure(a: 'hello', b: 'world');
- Изменено поведение при обработке видимости констант в интерфейсах.
interface I { public const FOO = 'foo'; } class C implements I { private const FOO = 'foo'; }
Расширены возможности функций array_sum (), array_product (), posix_getrlimit (), gc_status (), class_alias (), mysqli_poll (), array_pad () и proc_get_status ().
Объявлена устаревшей возможность передачи отрицательного значения $widths в mb_strimwidth (). Удалена константа NumberFormatter: TYPE_CURRENCY. Прекращена поддержка вызова функции ldap_connect () с двумя параметрами $host и $port. Удалена настройка opcache.consistency_checks.
Источник: http://www.opennet.ru/opennews/art.shtml? num=60172
© OpenNet