PHP 8.5 — большое обновление языка PHP. Оно содержит множество новых возможностей, таких как модуль URI, оператор Pipe, поддержка изменения свойств при клонировании и многое другое.
Быстрее, лучше, доступнее для разработчиков.
В PHP 8.5 добавлен модуль URI для анализа, нормализации и обработки URL-адресов в соответствии со стандартами RFC 3986 и WHATWG URL.
Оператор |> позволяет связывать вызываемые объекты слева направо, передавая значения через несколько функций без промежуточных переменных.
Клонируйте объекты и обновляйте свойства с помощью нового синтаксиса clone(), который упрощает использование шаблона «with-er» для классов readonly.
Атрибут #[\NoDiscard] выдаёт предупреждение, если возвращаемое значение не используется, что помогает предотвратить ошибки и повысить общую безопасность API.
Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях, таких как параметры атрибутов.
Теперь дескрипторы могут сохраняться между несколькими запросами PHP, что позволяет избежать затрат на повторную инициализацию соединения с одними и теми же хостами.
Встроенный модуль URI предоставляет API для безопасного анализа и изменения URI и URL в соответствии со стандартами RFC 3986 и WHATWG URL.
Работает на базе библиотек uriparser (RFC 3986) и Lexbor (WHATWG URL).
Узнайте больше об этой функции в блоге PHP Foundation.
$components = parse_url('https://php.net/releases/8.4/en.php');
var_dump($components['host']);
// string(7) "php.net"use Uri\Rfc3986\Uri;
$uri = new Uri('https://php.net/releases/8.5/en.php');
var_dump($uri->getHost());
// string(7) "php.net"Оператор Pipe позволяет связывать вызовы функций в цепочку без использования промежуточных переменных. Позволяет заменить множество «вложенных вызовов» цепочкой.
Узнайте больше об этой функции в блоге PHP Foundation.
$title = ' PHP 8.5 Released ';
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-',
trim($title)
)
)
);
var_dump($slug);
// string(15) "php-85-released"$title = ' PHP 8.5 Released ';
$slug = $title
|> trim(...)
|> (fn($str) => str_replace(' ', '-', $str))
|> (fn($str) => str_replace('.', '', $str))
|> strtolower(...);
var_dump($slug);
// string(15) "php-85-released"Теперь можно обновлять свойства во время клонирования объектов, передавая ассоциативный массив в функцию clone(). Это позволит напрямую поддерживать паттерн «with-er» для классов readonly.
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
$values = get_object_vars($this);
$values['alpha'] = $alpha;
return new self(...$values);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
return clone($this, [
'alpha' => $alpha,
]);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);Добавив атрибут #[\NoDiscard] к функции, PHP будет проверять, используется ли возвращаемое значение, и выдавать предупреждение, если это не так. Позволяет повысить безопасность API, где возвращаемое значение важно, но про него можно легко забыть.
Связанное приведение типов (void) может использоваться для указания, что значение намеренно не используется.
function getPhpVersion(): string
{
return 'PHP 8.4';
}
getPhpVersion(); // No warning#[\NoDiscard]
function getPhpVersion(): string
{
return 'PHP 8.5';
}
getPhpVersion();
// Warning: The return value of function getPhpVersion() should
// either be used or intentionally ignored by casting it as (void)Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях. Сюда входят параметры атрибутов, значения по умолчанию свойств и параметров, а также константы.
final class PostsController
{
#[AccessControl(
new Expression('request.user === post.getAuthor()'),
)]
public function update(
Request $request,
Post $post,
): Response {
// ...
}
}В отличие от curl_share_init(), дескрипторы, созданные с помощью curl_share_init_persistent(), не будут уничтожены в конце запроса PHP. Если найден постоянный дескриптор с тем же набором параметров, он будет использован повторно, что позволит избежать затрат на повторную инициализацию дескрипторов cURL при каждом запросе.
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_exec($ch);Функции array_first() и array_last() возвращают первое или последнее значение массива, соответственно. Если массив пустой, возвращается null (что упрощает работу с оператором ??).
$lastEvent = $events === []
? null
: $events[array_key_last($events)];$lastEvent = array_last($events);#[\Override] теперь может использоваться со свойствами.#[\Deprecated] теперь может использоваться с трейтами и константами.final) с помощью свойств в конструкторе.Closure::getCurrent() для упрощения рекурсии в анонимных функциях.setcookie() и setrawcookie() теперь поддерживают ключ "partitioned".get_error_handler() и get_exception_handler().Dom\Element::getElementsByClassName() и Dom\Element::insertAdjacentHTML().grapheme_levenshtein().#[\DelayedTargetValidation], который можно использовать для подавления ошибок компиляции атрибутов ядра и модулей, которые используются на недопустимых целях.`) как псевдоним для shell_exec() больше не поддерживается.(boolean), (integer), (double) и (binary) больше не поддерживаются. Вместо них используйте соответственно (bool), (int), (float) и (string).disable_classes была удалена, так как она приводила к нарушению различных допущений движка.case точкой с запятой вместо двоеточия больше не поддерживается.null в качестве смещения массива или при вызове array_key_exists() объявлено устаревшим. Вместо этого используйте пустую строку.class_alias() больше нельзя использовать массивы и замыкания в качестве псевдонимов классов.__sleep() и __wakeup() были мягко объявлены устаревшими. Вместо них следует использовать магические методы __serialize() и __unserialize().NAN в другие типы выдаётся предупреждение.null), с помощью [] или list() теперь выдаёт предупреждение.int), если они не могут быть представлены в виде целого числа.