Nowości w PHP 8.5 - Pipe Operator, array_first/last() i Fatal Error Backtraces

01.09.2025

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.

Kup pełny kurs PHP 8.4 🚀 Pobierz darmowy fragment 📥

Zobacz też inne wersje PHP