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(...);
Poznámka: Pipe operátor předá levý operand jako jediný argument pravé straně. Pro funkce s více argumenty (jako 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ínku
  • array_last() — vrátí poslední vyhovující prvek
  • array_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.

Tip: PHPStan na úrovni 8+ většinu těchto problémů odhalí ještě před upgradem. Doporučuji projít výstup s pravidlem 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ý.