PHP 8.5 for busy developers
| The |> pipe operator | |
| array_first and array_last | |
| #[NoDiscard] | |
| The URI extension | |
| Clone with overrides |
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
Article author: Arthur Isaev