PHP / Magento Dev Blog

  • Publikacje
  • O autorze
  • Kontakt

Jubileusz 100 wpisów – retrospektywa 6,5 roku, PHP 7.2->8.4, Magento 2.2->2.4.8

by Henryk Tews / wtorek, 18 lutego 2025 / Opublikowano w Magento 2

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.

About Henryk Tews

Co możesz przeczytać następne

Hyvä vs Luma benchmark – twarde liczby, LCP 3.5x szybszy, k6 load test, konwersja
Elasticsearch w Magento 2 – indeksowanie, debugowanie zapytań, własny analyzer dla polskiego
Optymalizacja wydajności – OPcache, Redis, N+1 queries, Blackfire, tabela priorytetów
  • 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}