Что нового в PHP 8.5
PHP 8.5, вероятно, будет выпущен как обычно где-то в конце 2025 года, возможно по традиции в ноябре, но уже сейчас стали известны некоторые подробности нового функционала и устаревания некоторых функций
В отличие от поста 4-х летней давности об PHP 7.5 - PHP 8.5 реально запланирован и будет следующей минорной версией.
Новое в PHP 8.5
Pipe-оператор |> rfc
В PHP 8.5 добавлен новый оператор - так называемый оператор конвейера ( |> ) для объединения нескольких вызываемых объектов слева направо, принимая возвращаемое значение левого вызываемого объекта и передавая его направо, то есть вместо этого:
$input = 'Какая_то строка.';
$output = strtolower(
str_replace(['.', '/', '…'], '',
str_replace(' ', '-',
trim($input)
)
)
);и этого:
$input = 'Какая_то строка.';
$temp = trim($input);
$temp = str_replace(' ', '-', $temp);
$temp = str_replace(['.', '/', '…'], '', $temp);
$output = strtolower($temp);можно будет писать:
$output = $input
|> trim(...)
|> fn (string $string) => str_replace(' ', '-', $string)
|> fn (string $string) => str_replace(['.', '/', '…'], '', $string)
|> strtolower(...);Новая функция curl_multi_get_handles
Расширение Curl в PHP 8.5 добавляет новую функцию curl_multi_get_handles, которая возвращает массив объектов CurlHandle из объекта CurlMultiHandle. Без этой функции для извлечения объектов CurlHandle, добавленных в CurlMultiHandle, приложению пришлось бы поддерживать список объектов CurlHandle, желательно в WeakMap:
$cm = curl_multi_init();
curl_multi_get_handles($cm);
// пустой массив
$ch1 = curl_init('https://example.com/foo');
$ch2 = curl_init('https://example.com/bar');
curl_multi_add_handle($cm, $ch1);
curl_multi_add_handle($cm, $ch2);
curl_multi_get_handles($cm);
// [$ch1, $ch2]Новая константа PHP_BUILD_DATE
В PHP 8.5 появится новая константа PHP_BUILD_DATE, которая показывает дату и время билда PHP, ранее эти данные были доступны только из функции phpinfo(), теперь же можно будет вывести так:
echo PHP_BUILD_DATE;
// Nov 22 2025 00:00:10Новые функции get_exception_handler и get_error_handler
До PHP 8.5 не было прямого способа получить текущие установленные обработчики ошибок и исключений с помощью set_error_handler и set_exception_handler. PHP 8.5 же добавляет функции: get_error_handler и get_exception_handler, которые закроют эту потребность:
/**
* Returns the currently set error handler, or null if none is set.
* @return callable|null
*/
function get_error_handler(): ?callable {}
/**
* Returns the currently set exception handler, or null if none is set.
* @return callable|null
*/
function get_exception_handler(): ?callable {}Пример использования:
set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}
set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}Новые функции array_first и array_last
До PHP 8.5, а если быть точнее в PHP 7.3 были добавлены функции array_key_first и array_key_last, для получения первого и последнего ключа в массиве, что интересно, извлечение значений, без изменения состояния массива, было добавлено только в PHP 8.5:
array_first- Извлечь первое значение из заданного массива, будет возвращенnullесли массив пуст.array_last- Извлечь последнее значение из заданного массива, будет возвращенnullесли массив пуст.
Обратите внимание, что эти функции возвращают значение
nullесли массив пуст. Однакоnull так же можетбыть допустимым значением массива.
Примеры использования:
array_first([1, 2, 3]); // 1
array_first([2, 3]); // 2
array_first(['a' => 2, 'b' => 1]); // 2
array_first([null, 2, 3]); // null
array_first([]); // null
array_first([$object, 2, 3]); // $object
array_first([1])); // 1
array_first([true]); // trueНовая директива INI max_memory_limit для установки максимума для memory_limit
Директива PHP INI memory_limit позволяет установить максимальный объём памяти, разрешённый для использования одним запросом. При превышении этого лимита выполнение останавливается. Но memory_limit - это директива INI_ALL, то есть её можно переопределить, используя ini_set('memory_limit', '200M');
Для более точного управления этим ограничением в PHP 8.5 появилась новая INI-директива max_memory_limit. При установке значения max_memory_limit - оно становится максимальным значением, которое разрешено установить memory_limit. Она установлена по умолчанию значением -1, то есть это ограничение отключено по умолчанию. max_memory_limit - это INI_SYSTEM INI-директива, то есть её нельзя изменить во время выполнения:
max_memory_limit=256M
memory_limit=128M
ini_get('max_memory_limit'); // "256M";
ini_get('memory_limit'); // "128M";
ini_set('memory_limit', '200M'); // Разрешено
ini_set('memory_limit', '256M'); // Разрешено
ini_set('memory_limit', '300M'); // Запрещено
Warning: Failed to set memory_limit to 314572800 bytes. Setting to max_memory_limit instead (currently: 268435456 bytes) in ... on line ...Устаревшее в PHP 8.5
Все MHASH_*константы устарели
В PHP 8.1 все mhash функции были объявлены устаревшими: mhash, mhash_count, mhash_get_block_size, mhash_get_hash_name, и mhash_keygen_s2k. Однако константы, которые эти функции принимали в качестве параметров, не были объявлены устаревшими. В PHP 8.5 все константы MHASH_* объявлены устаревшими вместе с существующим устареванием функций mhash:
mhash(MHASH_SHA1, 'test');
Constant MHASH_SHA1 is deprecated ....
Function mhash() is deprecated since 8.1 ...Устарели альтернативные приведения скалярных типов (boolean|double|integer|binary)
Скалярное приведение типов в PHP допускает некоторые вариации. Например, можно привести переменную к целому числу, используя как (int) так и (integer), например:
$value = '42';
(integer) $value; //int(42)
(int) $value; //int(42)Но те же альтернативные имена типов не поддерживаются в типах параметров, возвращаемых значений или свойств:
function test(integer $value): double {}
Warning: "double" will be interpreted as a class name. Did you mean "float"? Write "double" to suppress this warning in ... on line ...
Warning: "integer" will be interpreted as a class name. Did you mean "int"? Write "integer" to suppress this warning in ... on line ...Из-за этой непоследовательности PHP 8.5 прекращает поддержку четырех альтернативных имен скалярных типов:
(integer)
(double)
(boolean)
(binary)
Рекомендуется заменить их на (int), (float), (bool), (string)

Константин03.08.2025
|> - красиво) мне оч. нравится. Вот бы еще наконец созрели до обявления методов как у здоровых людей
function qwe {}
в
qwe {}
Тошнит от этого слова function и ->
мне не лень конечно (на самом деле лень) pf и tab наждать, но блин так некрасиво
А вообще обожаю php за грубость. Порой думаю, мол в следующий раз когда серв буду писать с 0 все на шарпе сделаю - строго, быстро, стильно (мою любимый язык по сути)... и каждый раз хватаю себя за руку. Думаю, Константин ты что курнул?, решил с этими типами возится? Опять те же грабли да? нафига тебе эти заморочки, тебе правда нужна скорость? Эта строгость? Иди проспись! ИМХО скорость кода это самое последнее что надо программисту в наше время. Часто никогда.
Так что иди и говнокоди дальше, забивая на все типы, все объявления и пр. как ты делал это всегда, а с шарпом в юните поиграешь или его огрызком TS во фронтенде.
P.S. Не знаю зачем все это написал. Прорвало на откровенность... Пожалею потом и удалю)
Спасибо за мысли и потраченное время!
У любого языка есть плюсы и минусы, без этого никуда, самое главное, когда язык развивается и не стоит на месте, чтобы не "умереть")