Релиз языка программирования PHP 8.4

После года разработки представлен релиз языка программирования PHP 8.4. Новая ветка включает серию новых возможностей, а также несколько изменений, нарушающих совместимость.

Ключевые изменения в PHP 8.4:

  • Предложена новая реализация JIT-компилятора, построенная на базе IR Framework. Ключевое отличие в том, что старый JIT напрямую генерировал машинные инструкции на основе байткода и с использованием разных бэкендов для архитектур x86_64 и AArch64, а новый JIT использует единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.

  • Добавлена поддержка прикрепления обработчиков свойств (property hook), позволяющих добавить дополнительную логику, выполняемую при изменении или доступе к свойствам объекта, реализуемую без перехвата операций чтения и записи при помощи общих функций __get и __set, и без создания дополнительных методов-обвязок. Применение обработчиков свойств даёт возможность существенно сократить объём кода и упростить переопределение поведения работы со свойствами, благодаря привязке собственного обработчика к каждому свойству.

       class User 
       {
           public string $name {
               set {
                   if (strlen($value) === 0) {
                    throw new ValueError("Name must be non-empty");
                   }
                   $this->name = $value;
               }   
           }
     
           public function __construct(string $name) {
               $this->name = $name;
           }
    }
    
  • Разрешено указание ссылок на методы в конструкции «new» без отделяющих скобок, т.е. вместо »$name = (new MyClass ())→method ()» теперь можно указывать »$name = new MyClass ()→method ()».

  • Добавлена возможность асимметричного управления видимостью свойств объектов (public, private, protected), отдельно для операций записи (set) и чтения (get). Например:
       class PhpVersion
       {
           public private(set) string $version = '8.4';
       }
    
       $phpVersion = new PhpVersion();
       var_dump($phpVersion->version); // string(3) "8.4"
       $phpVersion->version = 'PHP 8.3'; // error
    
  • Предоставлена штатная поддержка «ленивых» объектов (lazy), инициализация которых производится в момент первого использования.

  • Вместо общего параметра «opcache.jit_buffer_size» для управления JIT-компилятором и настройки размера буфера JIT предложены параметры «opcache.jit» и «opcache.jit_buffer_size». Для отключения JIT теперь можно указывать «opcache.jit=disable» вместо «opcache.jit_buffer_size=0». Внесены изменения, снижающие потребление памяти и повышающие производительность JIT в некоторых ситуациях.

  • Добавлен атрибут »#[\Deprecated]», предназначенный для пометки устаревших функций, классов и методов.

       #[\Deprecated("use newFunction() instead", since: "1.1")]
       function oldFunction() {
           // …
       }
    
  • Реализован класс \Dom\HTMLDocument, поддерживающий корректный разбор разметки HTML5.

  • Добавлена функция request_parse_body () для разбора HTTP-запросов с типом контента multipart/form-data (RFC1867).

  • Добавлены функции array_find (), array_find_key (), array_any () и array_all (). Функции array_find () и array_find_key () возвращают первый элемент или ключ в массиве, для которых сработала проверка, заданная через указанную пользователем callback-функцию. В свою очередь функции array_any () и array_all () возвращают любой совпавший элемент и все совпавшие элементы. Например, для вывода первого элемента, размер поля title в котором больше 5 символов, можно указать:

       $firstMatch = array_find(
           $posts, 
           function (Post $post) {
               return strlen($post-›title) › 5; 
           }
       );
    
  • Добавлены методы DateTime: getMicrosecond () и DateTimeImmutable: setMicrosecond ($microsecond) для получения и установки времени с микросекундной точностью, а также метод DateTime: createFromTimestamp ().

  • В PDO (PHP Data Objects), абстрактный интерфейс для работы с базами данных, добавлена возможность создания парсеров SQL и субклассов, специфичных для определённых драйверов СУБД. Добавлены новые субклассы Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc и Pdo\Sqlite.

  • Добавлены новые функции mb_trim (), mb_ltrim (), mb_rtrim (), mb_ucfirst (), mb_lcfirst (), bcceil (), bcdivmod (), bcfloor () и bcround (), pcntl_getcpu (), pcntl_getcpuaffinity (), pcntl_getqos_class (), pcntl_setns (), pcntl_waitid (), http_get_last_response_headers (), http_clear_last_response_headers (), fpow ()

  • Операции exit и die теперь можно вызывать в форме полноценных функций, которые допускается передавать в качестве аргумента в другие функции. Ранее возможности функций exit () и die () были сильно ограничены, так как они представляли собой обвязки над ключевыми словами exit и die.

  • Добавлены изменения, усложняющие эксплуатацию уязвимостей, вызванных выходом за границы буфера, а также усиливающие рандомизацию имён файлов, создаваемых через функцию tempnam ().

  • Объявлено устаревшим поведение, при котором для параметров функций с присвоенным по умолчанию значением null автоматически разрешалось присвоение значений null. Для того, чтобы подобные параметры могли принимать значения null теперь требуется явное указание префикса »?». Например, вместо «function save (Book $book = null) {}» следует указывать «function save (? Book $book = null) {}».

  • Объявлены устаревшими константы E_STRICT, MYSQLI_REFRESH_*, функции mysqli_ping (), mysqli_kill (), mysqli_refresh (), методы mysqli: ping (), mysqli: kill (), mysqli: refresh (), возможность использования »_» в качестве имени класса, некоторые свойства DOMDocument и DOMEntity. Запрещено переопределение констант класса GMP, для которого теперь выставлено ключевое слово «final».

Дополнительно, можно отметить выпуск статического анализатора PHPStan 2.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Анализатор предоставляет 10 уровней, охватывающих такие области, как выявление неопределённых переменных, неизвестных классов, функций и методов; проверка типов аргументов и возвращаемых значений; корректность использования некоторых типов; определение никогда не вызываемого кода. Код проекта написан на языке PHP и распространяется под лицензией MIT.



Источник: http://www.opennet.ru/opennews/art.shtml? num=62269

© OpenNet