Что нового в 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