Pipe operátor |>
Dlouho očekávaný pipe operátor konečně míří do PHP. Umožňuje řetězit volání funkcí čitelným způsobem — levý operand se předá jako první argument pravé funkce. Výsledný kód se čte shora dolů místo zevnitř ven.
// Dříve — těžko čitelné zanoření
trim(strtolower(str_replace(' ', '-', htmlspecialchars($title))));
// PHP 8.5 s pipe operátorem
$slug = $title
|> htmlspecialchars(...)
|> (fn($s) => str_replace(' ', '-', $s))
|> strtolower(...)
|> trim(...);
str_replace) je proto potřeba použít closure —
fn($s) => str_replace(' ', '-', $s).
First-class callable syntax htmlspecialchars(...) funguje přímo jen pro jednoargumentové funkce.
Nové funkce pro pole
PHP 8.4 přineslo array_find() a array_find_key(). PHP 8.5 na to navazuje
a rozšiřuje standardní knihovnu o další užitečné pomocníky:
array_first()— vrátí první prvek splňující podmínkuarray_last()— vrátí poslední vyhovující prvekarray_zip()— spojí více polí do pole dvojic
$users = [
['name' => 'Adam', 'active' => false],
['name' => 'Eva', 'active' => true],
['name' => 'Petr', 'active' => true],
];
$first = array_first($users, fn($u) => $u['active']);
// ['name' => 'Eva', 'active' => true]
Asymetrická viditelnost — rozšíření
PHP 8.4 zavedlo asymetrickou viditelnost vlastností (public private(set)).
PHP 8.5 ji doplňuje o zkrácenou syntaxi v konstruktoru a podporu v rozhraních:
class Order
{
public function __construct(
public private(set) readonly int $id,
public private(set) Status $status = Status::Pending,
) {}
public function confirm(): void
{
// zapsání je povoleno jen uvnitř třídy
$this->status = Status::Confirmed;
}
}
Zpřísnění typové kontroly
Jedna z méně viditelných, ale velmi důležitých změn: PHP 8.5 ve strict_types=1
režimu nově odmítá implicitní koerci celých čísel na float a naopak
v situacích, které dříve procházely tiše. Pokud v projektu nemáte zapnuté strict types,
je to dobrý důvod to konečně udělat a projít kód statickým analyzátorem.
strict
před nasazením na PHP 8.5.
Výsledek
PHP 8.5 nepřináší žádnou revoluční změnu, ale dále utahuje šrouby tam, kde to dává smysl. Pipe operátor výrazně zpřehlední funkcionálně orientovaný kód, nové pole-funkce ušetří psaní vlastních helperů a zpřísnění typů pomáhá psát odolnější aplikace. Upgrade z 8.4 by měl být pro dobře napsaný kód bezbolestný.