Релиз языка программирования 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