Setny wpis to dobry moment na retrospektywę. Blog zaczął się w lipcu 2018 – wtedy PHP 7.2 był świeży, Magento 2.3 dopiero wychodziło, Docker był „tym nowym narzędziem” a AI coding tools nie istniały. Przez ponad 6,5 roku zebrałem tu 100 wpisów o PHP, Magento 2, wzorcach projektowych i środowiskach deweloperskich. Dziś podsumowuję największe zmiany które faktycznie wpłynęły na moją codzienną pracę.
Jak zmieniło się PHP od 2018 do 2025
Kiedy zaczynałem ten blog, PHP 7.2 był aktualną wersją. W ciągu 6,5 roku język przeszedł transformację:
| Rok | Wersja PHP | Kluczowa zmiana |
|---|---|---|
| 2018 | 7.2 | object type hint, sodium zamiast mcrypt |
| 2018 | 7.3 | JSON_THROW_ON_ERROR, array_key_first/last |
| 2019 | 7.4 | Typed properties, arrow functions, preloading |
| 2020 | 8.0 | JIT, union types, match, named arguments, nullsafe operator |
| 2021 | 8.1 | Enums, readonly properties, fibers, intersection types |
| 2022 | 8.2 | Readonly classes, DNF types, deprecacja dynamicznych właściwości |
| 2023 | 8.3 | Typed class constants, json_validate(), clone with |
| 2024 | 8.4 | Property hooks, asymmetric visibility, Lazy Objects, BcMath\Number |
Kod PHP z 2018 vs 2025 – ta sama logika, inne narzędzia
<?php
// 2018 - PHP 7.2, typowy kod Magento
class OrderService
{
/** @var OrderRepositoryInterface */
private $repository;
/** @var LoggerInterface */
private $logger;
public function __construct(
OrderRepositoryInterface $repository,
LoggerInterface $logger
) {
$this->repository = $repository;
$this->logger = $logger;
}
/**
* @param int $orderId
* @return bool
*/
public function cancel($orderId)
{
try {
$order = $this->repository->get($orderId);
if ($order === null) {
return false;
}
if ($order->getStatus() === 'shipped') {
return false;
}
$order->setStatus('cancelled');
$this->repository->save($order);
$this->logger->info('Order cancelled: ' . $orderId);
return true;
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
return false;
}
}
}
<?php
declare(strict_types=1);
// 2025 - PHP 8.4, ten sam serwis
class OrderService
{
public function __construct(
private readonly OrderRepositoryInterface $repository,
private readonly LoggerInterface $logger
) {}
public function cancel(int $orderId): bool
{
try {
$order = $this->repository->get($orderId);
// Nullsafe operator (PHP 8.0) + match (PHP 8.0)
$canCancel = match($order?->getStatus()) {
'pending', 'processing' => true,
default => false,
};
if (!$canCancel) {
return false;
}
$order->setStatus('cancelled');
$this->repository->save($order);
$this->logger->info('Order cancelled', ['order_id' => $orderId]);
return true;
} catch (\Magento\Framework\Exception\NoSuchEntityException) {
// PHP 8.0: catch bez zmiennej
return false;
}
}
}
// 2025 - PHP 8.4 value object w tym samym projekcie
readonly class OrderStatusChange
{
public string $label {
get => match($this->newStatus) {
'cancelled' => 'Anulowane',
'processing' => 'W realizacji',
default => $this->newStatus,
};
}
public function __construct(
public readonly int $orderId,
public readonly string $previousStatus,
public readonly string $newStatus,
public readonly \DateTimeImmutable $changedAt = new \DateTimeImmutable()
) {}
}
Jak zmieniło się Magento 2 od 2018
W lipcu 2018 zaczynałem od Magento 2.2. Przez 6,5 roku platforma przeszła znaczące zmiany:
- 2.3 (2018) – MSI (Multi Source Inventory), GraphQL API, PWA Studio, Message Queue przez RabbitMQ
- 2.4 (2020) – Elasticsearch jako wymagany, usunięcie MySQL full-text, Security Enhancements
- 2.4.4 (2022) – PHP 8.1 wsparcie, Composer 2, deprecacja jQuery migrate
- 2.4.6 (2023) – PHP 8.2 wsparcie, OpenSearch jako alternatywa dla ES
- 2.4.7 (2023) – PHP 8.3 wsparcie, performance improvements
- 2.4.8 (2024) – PHP 8.4 wsparcie, OpenSearch jako default, async reindex
Moje 5 największych zmian w sposobie pracy
1. DDEV zamiast XAMPP – Od wpisu z grudnia 2018 już nigdy nie wróciłem do XAMPP. DDEV eliminuje problem „u mnie działa”, izoluje środowiska projektów i integruje się z PHPStorm w kilku kliknięciach.
2. PHPStan od poziomu 6 – Statyczna analiza kodu wykrywa błędy które wcześniej wychodziły na staging lub produkcji. Poziom 8 to cel dla nowego kodu, 6 to minimum które akceptuję przy code review.
3. Readonly i enumy zamiast stałych i docblocków – PHP 8.1 enumy zastąpiły klasy ze stałymi wszędzie gdzie mam skończony zestaw wartości. Readonly properties zastąpiły konwencje przez docblok. Kod jest krótszy i błędy typów są wychwytywane wcześniej.
4. AI jako junior code reviewer – Od połowy 2023 wklejam każdy diff do modelu konwersacyjnego zanim pójdzie na code review do kolegi. Wyłapuje oczywiste przeoczenia, sugeruje edge cases i generuje testy. Nie zastępuje review, ale uzupełnia.
5. Service Contracts jako jedyna droga w Magento – Pierwsze lata to było „getById przez model, save przez model”. Teraz to wyłącznie interfejsy z przestrzeni Api\ i nigdy bezpośrednio modele czy resource models w kodzie biznesowym.
Liczby bloga – suche fakty
| Metryka | Wartość |
|---|---|
| Łączna liczba wpisów | 100 |
| Okres | Lipiec 2018 – luty 2025 (6,5 roku) |
| Wpisy o PHP | ~25 |
| Wpisy o Magento 2 | ~25 |
| Wpisy o wzorcach projektowych | ~22 |
| Wpisy o algorytmach | ~12 |
| Wpisy o środowiskach / DevOps | ~10 |
| Wpisy o JS / React / Vue | ~6 |
Co dalej
Blog będzie kontynuowany w tym samym rytmie – dwa wpisy na miesiąc, przeplatając PHP, Magento 2, wzorce, algorytmy i środowiska. Na najbliższe miesiące mam już na oku: PHP 8.5 RFC postęp, Magento 2 performance z Hyvä w porównaniu z Lumą na liczbach, wzorzec Specification, Kubernetes basics dla PHP developera i kilka tematów które pojawiły się w komentarzach.
Dziękuję za 100 wpisów lektury. Feedback, tematy do omówienia i korekty błędów – zawsze mile widziane przez formularz kontaktowy.
Podsumowanie
100 wpisów to dużo, ale PHP i Magento 2 przez 6,5 roku zmieniły się na tyle że mógłbym napisać kolejne 100 bez powtórek. Język który zaczynałem dokumentować w wersji 7.2 ma teraz property hooks, enumy i Lazy Objects. Platforma która wymagała Dockera i ręcznej konfiguracji teraz ma DDEV i Hyvä. Narzędzia AI które w 2018 nie istniały, teraz są stałym elementem workflow. Jestem ciekaw co znajdzie się w wpisie #200.
