PHP 8.5 for busy developers

The |> pipe operator

Nested calls read inside out. The pipe sends each result into the next function, left to right, with no temp variables. Keep stages short - one expression each, either a first-class callable or an arrow function.

$slug = $title |> trim(...) |> (fn($s) => str_replace(" ", "-", $s)) |> strtolower(...);

array_first and array_last

Edge reads used to need a ternary with array_key_first(). array_first() and array_last() return the value directly, and null for an empty array - composing neatly with ??.

$first = array_first($events) ?? new Event(); $last = array_last($events);

#[NoDiscard]

Dropping a return value by accident is silent: the call succeeds and the result evaporates. Mark the function and PHP warns when the value is ignored. A deliberate void cast marks the value as intentionally unused.

#[NoDiscard] function price(float $base): float { return $base * 1.2; }

The URI extension

Hand-rolled URL checks drift into bugs. The URI extension parses and normalizes addresses as objects instead of string surgery, following RFC 3986 and the WHATWG URL standard.

use Uri\Rfc3986\Uri; $uri = new Uri("https://php.net/releases/8.5/en.php"); echo $uri->getHost();

Clone with overrides

Override-style copies used to rebuild objects by hand. Now clone() takes new values for chosen properties. Full details: What is new in PHP 8.5.

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]); } }

Next: Hero roadmap: the whole course on one page

Автор статьи: Arthur Isaev