PHP 9469 ~ 6 мин.

Что нового в PHP 8.4

Что нового в PHP 8.4

PHP 8.4, вероятно, будет выпущен как обычно где-то в конце 2024 года, возможно по традиции в ноябре

Когда выйдет PHP 8.4?

PHP 8.4, вероятно, будет выпущен где-то в конце 2024 года. Данный пост будет пополняться новыми функциями и устареваниями по мере появления RFC. 

Как установить и протестировать PHP 8.4?

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

Новый JIT-движок

Как вы знаете JIT появился в PHP 8.0 и представлял из себя компиляцию "на лету" - Just In Time, в PHP 8.4 будет новый JIT-движок. Теперь это настоящий оптимизирующий компилятор с промежуточным представлением, аналогичный серверному компилятору Java HotSpot

phpinfo отображает информации о размере целочисленного типа (int) PR

Вывод phpinfo() в PHP 8.4 показывает размер целого числа, поддерживаемый текущей настройкой PHP в битах, также включается в выходные данные PHP CLI:

Ранее все предыдущие версии (начиная с PHP 5.0.5) поддерживали константы PHP_INT_SIZE для определения размера целого числа.

Поддержка AEGIS-128L и AEGIS256 в Sodium

AEGIS - это семейство алгоритмов шифрования с проверкой подлинности на основе AES, которые работают быстрее, чем AES-GCM. Расширение Sodium в PHP 8.4 поддерживает алгоритмы шифрования AEGIS-128L и AEGIS256, если расширение Sodium скомпилировано с версией libsodium 1.0.19 или новее. Расширение Sodium в PHP 8.4 добавляет шесть новых функций и четыре новые константы PHP для AEGIS-128L и AEGIS-256AEAD.

Новые функции http_get_last_response_headers и http_clear_last_response_headers

В PHP 8.4 добавлены две новые функции, http_get_last_response_headers и http_clear_last_response_headers, которые можно использовать для получения и очистки HTTP-заголовков последнего HTTP ответа, которые могут заменить легендарную переменную $http_response_header.

Новый метод DateTime createFromTimestamp

До PHP 8.4, чтобы создать экземпляр DateTime или DateTimeImmutable из временной метки UNIX, его нужно было создать с помощью createFromFormat:

$dt = DateTimeImmutable::createFromFormat('U', (string) 1703485481);
$dt->format('Y-m-d'); // "2023-12-25"


С PHP 8.4 классы DateTime и DateTimeImmutable в PHP 8.4 имеют новый метод createFromTimeStamp, позволяющий легко создать экземпляр из заданной временной метки UNIX в виде целого числа или значения с плавающей запятой.

$dt = DateTimeImmutable::createFromTimeStamp(1703485481);
$dt->format('Y-m-d'); //"2023-12-25"

Новые функции mbstring: mb_trim, mb_ltrim, и mb_rtrim

В PHP 8.4 будут добавлены эквивалентные мультибайтные функции существующих trim, ltrim, и rtrim:

function mb_trim(string $string, string $characters = '...'): string

function mb_ltrim(string $string, string $characters = '...', ?string $encoding = null): string {}

function mb_rtrim(string $string, string $characters = '...', ?string $encoding = null): string {}

Новая функция request_parse_body

В PHP 8.4 добавлена ​​новая функция request_parse_body, которая предоставляет встроенную функциональность анализа запросов для других методов HTTP-запросов,таких как например PUT, DELETE и PATCH. Функция request_parse_body считывает все содержимое, которое доступно в потоке php://input и создает значения, которые можно использовать в переменных $_POST и $_FILES:

[$_POST, $_FILES] = request_parse_body();

Хуки свойств

Итак, наконец-то долгожданная обнова случилась и в PHP 8.4 у нас появятся полноценные свойства, с возможностью задавать хуки get и set (а в будущем и не только их):

class User 
{
    public string $name {
        set {
            if (strlen($value) === 0) {
                throw new ValueError("Name must be non-empty");
            }
            $this->name = $value;
        }
        get {
            return strtoupper($this->name);
        }
    }
 
    public function __construct(string $name) {
        $this->name = $name;
    }
}

Что примечательно, благодаря этому RFC так же можно асимметрично объявлять публичные свойства в интерфейсах. Класс реализации может предоставить свойство через обычное свойство или хуки:

interface I
{
    // Класс, реализующий интерфейс ДОЛЖЕН иметь публичное свойство,
    public string $readable { get; } 
    // Класс реализации ДОЛЖЕН иметь публичное свойство для записи,
    public string $writeable { set; } 
    // Класс реализации ДОЛЖЕН иметь свойство, которое является публичным и
    // доступно для чтения и записи.
    public string $both { get; set; }
}

Улучшение обратных вызовов в ext/dom и ext/xsl

В PHP 8.4 будет улучшена поддержка вызываемых типов XSLTProcessor::registerPHPFunctions() и DOMXPath::registerPhpFunctions() методов:

function my_callback(string $href): bool {
    return preg_match("/cat/", $href);
}
$xpath = new DOMXPath($doc);

// Это необходимо для разрешения имени php в выражении php:function ниже
$xpath->registerNamespace("php", "http://php.net/xpath");

// При этом функция "my_callback" регистрируется в XPath, так что может быть вызвана
$xpath->registerPhpFunctions("my_callback");

// При этом выбираются все теги <a>, где my_callback (содержимое их атрибута href) возвращает true.
$results = $xpath->evaluate("//a[php:function('my_callback', string(@href))]");
foreach ($results as $result) {
    echo "Found ", $result->textContent, "
";
}

/*
Found Jill
Found Kes
Found Minou
Found Tessa
*/ 

Изменения синтаксиса/функциональности

Создание экземпляров класса без дополнительных круглых скобок

В PHP 8.4 появилась возможность опускать дополнительные скобки при new выражении, т.е. вместо:

$request = (new Request())->withMethod('GET');

можно писать такой синтаксис:

$request = new Request()->withMethod('GET'); 

Хеширование паролей: алгоритмическая сложность Bcrypt по умолчанию изменена с 10 на 12

В PHP 8.4 параметр cost алгоритма PASSWORD_BCRYPT/PASSWORD_DEFAULT изменился с 10 на 12, чтобы сделать пароли более устойчивыми и сложными.

Это изменение по существу эквивалентно:

password_hash("some password", PASSWORD_BCRYPT, ["cost" => 12]);

Способ отключения JIT по умолчанию rfc

До PHP 8.4 JIT был отключен по умолчанию, используя значение по умолчанию opcache.jit_buffer_size=0 вместо opcache.jit=disable. Это фактически отключает JIT не потому, что jit=disable, а потому что размер буфера установлен равный 0.

В этом RFC предлагается изменить эти значения по умолчанию на выключенный jit и размер буфера на 64 мегабайт:

opcache.jit=disable
opcache.jit_buffer_size=64m

Тип констант PHP_ZTS и PHP_DEBUG изменен с int на bool

PHP_ZTS и PHP_DEBUG - две глобальные константы PHP, которые предоставляют информацию о текущей среде выполнения PHP.

  • PHP_ZTS: Указывает, является ли текущая сборка PHP потокобезопасной.

  • PHP_DEBUG: Указывает, является ли текущая сборка PHP отладочной сборкой.

До PHP 8.4 эти две константы содержали целочисленные значения: 0 когда отключено и 1 когда включено. Начиная с PHP 8.4 и более поздних версий, они изменились на логические значения .

if (PHP_ZTS === 1) {} //было
if (PHP_ZTS) {} //стало

Устаревшие функции

Curl: CURLOPT_BINARYTRANSFER

Константа CURLOPT_BINARYTRANSFER, предоставляемая расширением Curl, устарела в PHP 8.4. Эта константа не имела никакого эффекта, начиная с PHP 5.1.2.

Удалены функции и возможности

Pspell было перенесено из PHP Core в PECL

Расширение Pspell предоставляет из себя PHP функции проверки орфографии с помощью Pspell или Aspell. Зависимости этого расширения не получали никаких обновлений за последние несколько лет, в результате чего было принято решение расширение Pspell перенести из ядра PHP в расширение PECL в PHP 8.4.

IMAP было перенесено из PHP Core в PECL

Расширение IMAP в PHP обеспечивает функциональность для работы с почтовыми ящиками по протоколу IMAP. Базовая библиотека C, от которой зависит расширение, не получала никаких обновлений с 2018 года. Расширение IMAP также создает еще несколько проблем:

  • Отсутствие потокобезопасности. Сборки PHP-ZTS не могут собрать это расширение.

  • Отсутствие поддержки аутентификации XAUTH .

  • Ошибки в работе POP.

В PHP 8.4 расширение IMAP больше не является частью PHP Core и перешло в PECL, но рекомендуется перейти на альтернативные библиотеки, например Webklex/php-imap.

OCI8 и PDO-OCI были перенесены из PHP Core в PECL

Расширения oci8 и pdo_oci8 предоставляют функциональные возможности для использования баз данных Oracle в PHP. Эти расширения основаны на собственных библиотеках коммерческого поставщика Oracle. Эти расширения прошли длительный период накопления неисправленных ошибок и требуют значительных усилий для миграции их resource объектов в объекты классов. Учитывая зависимость этих расширений от сторонних проприетарных библиотек и необходимость усилий по их обслуживанию, расширения больше не являются частью ядра PHP и перешли на PECL как oci8 и pdo_oci.

Другое

Так же можно посмотреть черновик, связанный с функциями, которые должны быть объявлены устаревшими в PHP 8.4 и удалены в PHP 9.0:

  • DOMAttr::schemaTypeInfo и DOMElement::schemaTypeInfo

  • DOMImplementation::getFeature($feature, $version)

  • Constant DOM_PHP_ERR

  • mysqli_ping() и mysqli::ping()

Что думаешь?

Сергей22.09.2024

Где-то пыха свернула не туда и стала превращаться в ES

zo0M30.06.2024

Очень информативно и без "воды", спасибо!

Илья23.06.2024

Очень свежий, оригинальный и необычный дизайн сайта!
Моё почтение!

Но я с ужасом увидел самую последнюю запись, что метод `mysqli::ping()` собираются признать устаревшим и удалить.

Призываю поддержать мой комментарий, или оставить свой, и не допустить этого.
https://github.com/php/php-src/pull/11945#issuecomment-2185148220

Qomi16.06.2024

Мне понравилось, спасибо :)

Человек09.02.2024

Замечательно, непосвящённому человеку почитать в сжатой форме на русском языке о нововведениях - да это же находка.

Категории
  • PHP 67
  • Заметки 18
  • Безопасность 4
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

Делаем из мухи слона

sergeymukhin.com

персональный блог о веб-разработке от Сергея Мухина. Блог был основан в 2018 году, и собирался уделять основное внимание последним тенденциям, учебным пособиям, а также советам и рекомендациям, позволяющим начинающим девелоперам встать быстрее на правильную дорогу веб разработки, но что-то пошло не так 😃

Релизы PHP 8.4

Дата Релиз
4 Июля 2024 Альфа 1
18 Июля 2024 Альфа 2
1 Августа 2024 Альфа 3
13 Августа 2024 Feature freeze
15 Августа 2024 Бета 1
29 Августа 2024 Бета 2
12 Сентября 2024 Бета 3
26 Сентября 2024 RC 1
10 Октября 2024 RC 2
24 Октября 2024 RC 3
7 Ноября 2024 RC 4
21 Ноября 2024 GA

Что нового?