Nowości w PHP 8.5 - Pipe Operator, array_first/last() i Fatal Error Backtraces
PHP 8.5, którego premiera zaplanowana jest na 20 listopada 2025 roku, wprowadza długo oczekiwany operator pipe (|>), nowe funkcje pomocnicze dla tablic oraz ulepszone debugowanie z automatycznymi backtrace dla błędów krytycznych.
Dlaczego PHP 8.5?
PHP 8.5 koncentruje się na developer experience - wprowadza funkcje, które czynią kod bardziej czytelnym, funkcyjnym i łatwiejszym do debugowania. Operator pipe to jedna z najbardziej wyczekiwanych funkcji w historii PHP.
1. Pipe Operator (|>) - Operator Łańcuchowy
Operator pipe pozwala na przekazywanie wyniku jednej funkcji jako pierwszego argumentu kolejnej funkcji, tworząc czytelne łańcuchy operacji od lewej do prawej. To alternatywa dla zagnieżdżonych wywołań funkcji.
<?php
// PHP 8.5 - z operatorem pipe
$result = $input
|> trim(...)
|> strtolower(...)
|> str_replace(' ', '-', ...)
|> substr(..., 0, 50);
// PHP 8.4 - zagnieżdżone wywołania (nieczytelne)
$result = substr(
str_replace(' ', '-',
strtolower(
trim($input)
)
),
0,
50
);
// Praktyczny przykład - przetwarzanie danych użytkownika
$username = $_POST['username']
|> trim(...)
|> strtolower(...)
|> preg_replace('/[^a-z0-9_]/', '', ...)
|> substr(..., 0, 20);
// Z closures dla złożonych operacji
$price = $product->getPrice()
|> fn($p) => $p * 1.23 // dodaj VAT
|> fn($p) => round($p, 2)
|> fn($p) => max($p, 10.00); // min. cena
// Kompozycja funkcji
$processText = fn($text) => $text
|> trim(...)
|> strip_tags(...)
|> htmlspecialchars(..., ENT_QUOTES);
$clean = $processText($userInput);
2. array_first() i array_last() - Nowe Funkcje Tablicowe
PHP 8.5 dodaje dwie długo oczekiwane funkcje do pobierania pierwszego i ostatniego elementu tablicy, uzupełniając istniejące array_key_first() i array_key_last() z PHP 7.3.
<?php
$users = [
['name' => 'Jan', 'age' => 30],
['name' => 'Anna', 'age' => 25],
['name' => 'Piotr', 'age' => 35],
];
// PHP 8.5 - proste i czytelne
$first = array_first($users);
// ['name' => 'Jan', 'age' => 30]
$last = array_last($users);
// ['name' => 'Piotr', 'age' => 35]
// PHP 8.4 - trzeba było kombinować
$first = reset($users); // modyfikuje wskaźnik tablicy!
$last = end($users); // modyfikuje wskaźnik tablicy!
// lub
$first = $users[array_key_first($users)];
$last = $users[array_key_last($users)];
// Bezpieczne dla pustych tablic
$empty = [];
$first = array_first($empty); // null
$last = array_last($empty); // null
// Kombinacja z pipe operator
$result = $collection
|> array_filter(..., fn($x) => $x > 10)
|> array_map(fn($x) => $x * 2, ...)
|> array_first(...);
3. Fatal Error Backtraces - Automatyczne Backtraces
PHP 8.5 domyślnie włącza backtrace dla błędów krytycznych (fatal errors), co znacznie ułatwia debugowanie. Wcześniej trzeba było ręcznie konfigurować xdebug lub error handler.
<?php
// W PHP 8.5 fatal errors automatycznie pokazują pełny stack trace
class User
{
private array $data;
public function getName(): string
{
return $this->data['name']; // Fatal error jeśli $data nie jest zainicjowane
}
}
$user = new User();
$name = $user->getName();
// PHP 8.5 Output:
// Fatal error: Uncaught Error: Typed property User::$data must not be accessed before initialization
// Stack trace:
// #0 /path/to/file.php(12): User->getName()
// #1 {main}
// thrown in /path/to/file.php on line 7
// PHP 8.4 Output (bez stack trace):
// Fatal error: Uncaught Error: Typed property User::$data must not be accessed before initialization
// in /path/to/file.php:7
4. get_error_handler() / get_exception_handler()
Nowe funkcje pozwalają na introspekcję aktualnie ustawionych handlerów błędów i wyjątków. Przydatne w testach i przy debugowaniu.
<?php
// Ustawienie custom handlera
set_error_handler(function($errno, $errstr) {
echo "Error: $errstr";
});
set_exception_handler(function($exception) {
echo "Exception: " . $exception->getMessage();
});
// PHP 8.5 - sprawdzenie aktywnych handlerów
$errorHandler = get_error_handler();
$exceptionHandler = get_exception_handler();
var_dump($errorHandler); // object(Closure)
var_dump($exceptionHandler); // object(Closure)
// Przywracanie poprzedniego handlera
$oldHandler = get_error_handler();
set_error_handler(function($errno, $errstr) {
// nowa logika
});
// później przywróć
restore_error_handler();
set_error_handler($oldHandler);
5. Asymmetric Visibility for Static Properties
Rozszerzenie asymetrycznej widoczności z PHP 8.4 na właściwości statyczne. Możesz mieć publiczny odczyt i prywatny/chroniony zapis dla static properties.
<?php
class Config
{
public private(set) static string $environment = 'production';
public private(set) static array $settings = [];
public static function setEnvironment(string $env): void
{
// Tylko wewnątrz klasy możesz modyfikować
self::$environment = $env;
}
public static function updateSettings(array $settings): void
{
self::$settings = array_merge(self::$settings, $settings);
}
}
// Odczyt publiczny
echo Config::$environment; // 'production'
// Zapis tylko przez metody
Config::setEnvironment('development');
// Error - bezpośredni zapis z zewnątrz
Config::$environment = 'test'; // Fatal error
Inne ważne nowości w PHP 8.5
- URL Parsing Classes - nowe klasy do parsowania URL zgodnie z RFC 3986 i WHATWG URL
- Attributes on constants - możliwość dodawania atrybutów do stałych
- Final property promotion - słowo kluczowe final dla promoted properties
- curl_multi_get_handles() - pobieranie wszystkich handlerów z curl_multi
🎓 Chcesz poznać wszystkie nowości PHP?
Ten wpis to fragment kompleksowego kursu PHP 8.4, w którym szczegółowo omawiam wszystkie wersje PHP 8.x wraz z praktycznymi przykładami z rzeczywistych projektów.