Что нового в 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. Не знаю зачем все это написал. Прорвало на откровенность... Пожалею потом и удалю)
Спасибо за мысли и потраченное время!
У любого языка есть плюсы и минусы, без этого никуда, самое главное, когда язык развивается и не стоит на месте, чтобы не "умереть")