PHP 8.5 — це значне оновлення мови PHP, яке містить нові можливості, зокрема розширення URI, оператор Pipe та підтримку модифікації властивостей під час клонування.
Швидший, зрозуміліший, створений для розробників.
У PHP 8.5 додано розширення URI для аналізу, нормалізації та обробки URL-адрес відповідно до стандартів RFC 3986 і WHATWG URL.
Оператор |> дозволяє об'єднувати виклики у ланцюжок зліва направо, плавно передаючи значення через кілька функцій без проміжних змінних.
Клонуйте об'єкти та оновлюйте властивості за допомогою нової синтаксичної конструкції clone(), яка спрощує використання шаблону «with-er» для readonly класів.
Атрибут #[\NoDiscard] попереджає, коли повернене значення не використовується, допомагаючи запобігти помилкам і підвищити загальну безпеку API.
Статичні замикання та callable-вирази першого класу тепер можна використовувати в константних виразах, таких як параметри атрибутів.
Дескриптори тепер можуть зберігатися між декількома 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)Статичні замикання та callable-вирази першого класу тепер можна використовувати в константних виразах. Це стосується параметрів атрибутів, значень за замовчуванням для властивостей і параметрів, а також констант.
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() тепер викликає попередження.