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.
