Состоялся релиз языка программирования PHP 8.3, включая сборки для ОС Windows. В ветку добавлены обновления, а также серия изменений, которые нарушают совместимость с предыдущими версиями.
Согласно данным OpenNET, основные изменения и дополнения в PHP 8.3 включают в себя:
во время клонирования классов предоставлена возможность повторной инициализации свойств с атрибутом "readonly". Переопределение readonly-свойств допускается только внутри функции "__clone";
предоставлена возможность использования констант с указанием типа в классах, типажах и перечислениях;
добавлена поддержка атрибута "#[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');
добавлена возможность создания анонимных классов в режиме только для чтения;
добавлена функция json_validate() для быстрой проверки соответствия строки формату JSON без выполнения операций декодирования;
в класс Randomizer, предоставляющий высокоуровневый API для генерации псеводослучайных чисел и последовательностей, добавлены новые методы: getBytesFromString для формирования строки заданного размера, использующей в случайном порядке символы, присутствующие в другой строке; getFloat и nextFloat для генерации случайного числа с плавающей запятой, укладывающегося в указанный диапазон;
добавлена возможность извлечения констант, используя синтаксис динамических классов;
добавлена генерация отдельных исключений (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;
расширены возможности функций 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.
В июле 2020 года Microsoft предупредила сообщество разработчиков PHP, что компания не собирается заниматься поддержкой новых версий PHP, включая 8.0 и выше, для Windows. Представитель сообщества разработчиков PHP ответил Microsoft, что сообщество глубоко признательно компании за проделанную их специалистами работу по поддержке PHP на Windows на протяжении многих лет. Также в сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы продолжить организацию поддержки PHP 8.0 и выше для Windows своими силами.