PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

PHP 9.0 pierwsze RFC – co zostanie usunięte, typed arrays dyskusja, timeline

by Henryk Tews / wtorek, 03 lutego 2026 / Opublikowano w PHP

PHP 9.0 jest planowane na koniec 2027 lub 2028 – jeszcze dużo czasu, ale RFC proces już się toczy. Pierwsze propozycje trafiły na wiki.php.net i listę internals w Q4 2025. Dla PHP developera który ma duże projekty w produkcji to właśnie teraz jest czas żeby zobaczyć co trzeba będzie zmienić. Przeglądam co jest potwierdzone do usunięcia, co jest dyskutowane i jaka jest ogólna filozofia tej wersji major.

PHP 9.0 – wersja major, czyli co to znaczy

Wersje major PHP (5.0, 7.0, 8.0) to okazja do usunięcia starych deprecacji i przełomowych zmian. PHP 8.0 usunęło dużo starych funkcji i skończyło erę PHP 5 patterns. PHP 9.0 powinno zakończyć erę „pre-typed PHP” – wszystkich miejsc gdzie typy są opcjonalne lub niejawne.

Potwierdzone usunięcia – już deprecated, w 9.0 Error

<?php

// 1. Implicit nullable parameters – TypeError od PHP 9.0
// Deprecated od PHP 8.4, Error od PHP 9.0
function sendEmail(string $to, string $subject = null): void {} // Error!
function sendEmail(string $to, ?string $subject = null): void {} // OK

// 2. Dynamiczne właściwości bez #[AllowDynamicProperties]
// Deprecated od PHP 8.2, Error od PHP 9.0
class User
{
    public string $name = '';
}

$user = new User();
$user->nonExistentProperty = 'value'; // Error w PHP 9.0!

// Rozwiązanie:
#[\AllowDynamicProperties]
class LegacyUser {} // zezwól jawnie

// lub dodaj właściwość:
class User
{
    public string $name = '';
    private array $extraData = [];

    public function __set(string $name, mixed $value): void
    {
        $this->extraData[$name] = $value;
    }
}

// 3. Stare aliasy funkcji
// join() -> implode() (join() Error od PHP 9.0)
join(', ', $items); // Error
implode(', ', $items); // OK

// pos() -> current() – Error
// sizeof() -> count() – Error

// 4. Callable strings dla metod instancji
$callable = 'ClassName::methodName';
call_user_func($callable); // Deprecated zachowanie

// 5. Curly brace syntax dla string/array access
$str = 'hello';
echo $str{0}; // Error (już deprecated w PHP 8.0, Error w PHP 9.0)
echo $str[0]; // OK

Dyskutowane nowości – nie potwierdzone

<?php

// RFC w dyskusji – może, ale nie na pewno

// 1. Typed arrays – największy brakujący element systemu typów
// Jak mogłoby wyglądać (spekulacja, nie finalna składnia):
function processItems(array<string> $items): array<int>
{
    return array_map('strlen', $items);
}
// Problem techniczny: PHP nie weryfikuje typów w runtime przy tablicach
// To zrobiłoby z typed arrays compile-time only feature (jak TypeScript)
// Dyskusja trwa od PHP 7.x bez konsensusu

// 2. Named arguments w więcej kontekstach
// Aktualnie: named args działają przy wywołaniu funkcji
// RFC: rozszerzyć na array unpacking, some built-ins
$result = [...compact(x: $x, y: $y)]; // spekulatywna składnia

// 3. First class enums jako types w array context
function getStatuses(): array<OrderStatus> // nie działa w PHP 8.x
{
    return [OrderStatus::Pending, OrderStatus::Processing];
}

// 4. Intersection types w więcej kontekstach
// PHP 8.1 dodało A&B dla parametrów
// RFC: A&B w return types, properties, generics context

// 5. Partial application / currying
// Spekulatywna składnia inspirowana Haskell/F#:
$double = fn($x) => $x * 2;
$addTen = fn($x) => $x + 10;

// Composition operator:
$transform = $double >> $addTen; // spekulatywne
$result    = $transform(5); // (5 * 2) + 10 = 20

Co PHP 9.0 NIE zmieni

Czego możemy być pewni że zostaje:

  • Podstawowa składnia PHP – nawiasy klamrowe, średniki, $zmienne
  • System klas OOP – extends, implements, abstract, final, readonly
  • System typów z PHP 8.x – union types, intersection, nullsafe, match
  • Property hooks i asymmetric visibility z PHP 8.4
  • Pipe operator z PHP 8.5
  • Kompatybilność wsteczna z dobrze napisanym PHP 8.x kodem

Jak przygotować projekty dziś

# Napraw potwierdzone deprecacje teraz – zanim staną się Errorami

# 1. Implicit nullable - Rector to naprawia automatycznie
vendor/bin/rector process src \
    --only=\Rector\Php81\Rector\FunctionLike\IntersectionTypesRector \
    --dry-run

# Albo PHPStan z php-version=9.0 (gdy będzie dostępny)
vendor/bin/phpstan analyse --php-version=9.0 src/

# 2. Dynamiczne właściwości - sprawdź
# PHPStan na poziomie 5+ już to raportuje jako błąd
vendor/bin/phpstan analyse --level=5 src/ | grep "dynamic"

# 3. Aliasy funkcji - szybki skan
grep -rn "\bjoin(" src/ | grep -v "implode"
grep -rn "\bsizeof(" src/ | grep -v "count"

# 4. Curly brace string access
grep -rn "\$[a-zA-Z_]*{[0-9]\+}" src/

Timeline – kiedy realnie PHP 9.0?

Wersja Data (szacowane) Kluczowe zmiany
PHP 8.5 Listopad 2025 (wyszło) Pipe operator, readonly dziedziczenie
PHP 8.6 Listopad 2026 Kolejne deprecacje, drobne RFC
PHP 8.7 Listopad 2027 (może 9.0) Ostatnia 8.x lub pierwsza 9.0
PHP 9.0 Listopad 2027 lub 2028 Usunięcie deprecated, potencjalne typed arrays

Podsumowanie

PHP 9.0 to perspektywa 2-3 letnia – czas który jest teraz. Naprawienie implicit nullable parameters i dynamicznych właściwości w projektach zajmuje dzień z Rectorem i PHPStan, a eliminuje grubą warstwę technicznego długu przed wielką migracją. Obserwuję php-internals i wrócę do tego tematu gdy pojawią się pierwsze głosowania RFC – prawdopodobnie pod koniec 2026.

About Henryk Tews

Co możesz przeczytać następne

PHP 7.2 – object type hint, sodium zamiast mcrypt, deprecacje
PHP 8.5 RC1 – pipe operator w realnym kodzie, pułapki, readonly dziedziczenie potwierdzone
Drupal 10 – Entity Types, hooks, DI, headless przez JSON:API, porównanie z WP i Magento
  • Publikacje
  • O autorze
  • Kontakt

© 2026 Created by

GÓRA
Zarządzaj zgodą
Aby zapewnić jak najlepsze wrażenia, korzystamy z technologii, takich jak pliki cookie, do przechowywania i/lub uzyskiwania dostępu do informacji o urządzeniu. Zgoda na te technologie pozwoli nam przetwarzać dane, takie jak zachowanie podczas przeglądania lub unikalne identyfikatory na tej stronie. Brak wyrażenia zgody lub wycofanie zgody może niekorzystnie wpłynąć na niektóre cechy i funkcje.
Funkcjonalne Zawsze aktywne
Przechowywanie lub dostęp do danych technicznych jest ściśle konieczny do uzasadnionego celu umożliwienia korzystania z konkretnej usługi wyraźnie żądanej przez subskrybenta lub użytkownika, lub wyłącznie w celu przeprowadzenia transmisji komunikatu przez sieć łączności elektronicznej.
Preferencje
Przechowywanie lub dostęp techniczny jest niezbędny do uzasadnionego celu przechowywania preferencji, o które nie prosi subskrybent lub użytkownik.
Statystyka
Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do celów statystycznych. Przechowywanie techniczne lub dostęp, który jest używany wyłącznie do anonimowych celów statystycznych. Bez wezwania do sądu, dobrowolnego podporządkowania się dostawcy usług internetowych lub dodatkowych zapisów od strony trzeciej, informacje przechowywane lub pobierane wyłącznie w tym celu zwykle nie mogą być wykorzystywane do identyfikacji użytkownika.
Marketing
Przechowywanie lub dostęp techniczny jest wymagany do tworzenia profili użytkowników w celu wysyłania reklam lub śledzenia użytkownika na stronie internetowej lub na kilku stronach internetowych w podobnych celach marketingowych.
  • Zarządzaj opcjami
  • Zarządzaj serwisami
  • Zarządzaj {vendor_count} dostawcami
  • Przeczytaj więcej o tych celach
Zobacz preferencje
  • {title}
  • {title}
  • {title}