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