PHP 7.2 wyszło w listopadzie 2017 roku, ale w praktyce wiele projektów migruje na tę wersję dopiero teraz. Jeśli nadal siedzisz na 7.0 lub 7.1 – ten wpis jest dla Ciebie. Przeglądam najważniejsze zmiany, które realnie wpływają na codzienny kod.
1. Typowanie obiektów w parametrach i zwracanych wartościach
PHP 7.2 jako pierwsza wersja pozwala na użycie object jako type hint. Brzmi prosto, a w praktyce bardzo porządkuje interfejsy, które przyjmują dowolne obiekty:
<?php
// Przed PHP 7.2 – brak type hinta, musisz sprawdzać ręcznie
function logObject($obj): void {
if (!is_object($obj)) {
throw new \InvalidArgumentException('Expected object');
}
// ...
}
// PHP 7.2 – type hint "object" robi to za Ciebie
function logObject(object $obj): void {
// jeśli przekażesz coś innego niż obiekt, dostaniesz TypeError
echo get_class($obj);
}
Szczególnie przydatne przy pisaniu generycznych helperów logujących, serializujących lub mapujących dane z zewnętrznych API.
2. Rozszerzenie typów parametrów (contravariance)
To subtelna, ale ważna zmiana. W PHP 7.2 możesz rozszerzyć type hint parametru w klasie potomnej – czyli zastąpić bardziej szczegółowy typ bardziej ogólnym. Przed 7.2 PHP rzucał błąd.
<?php
class Collection {}
class SpecialCollection extends Collection {}
class ParentHandler {
public function handle(SpecialCollection $c): void {}
}
// PHP 7.2: można poszerzyć typ do Collection lub object
class ChildHandler extends ParentHandler {
public function handle(Collection $c): void {}
}
W Magento 2 będziesz na to uważać przy overridowaniu metod przez plugins lub preferences – zbyt agresywne rozszerzenie typów może ukryć błędy logiki biznesowej.
3. Stałe w interfejsach bez modifikatora widoczności (i deprecacja)
PHP 7.2 deprecjonuje użycie each() oraz nieuprawione użycie liczb jako kluczy asocjacyjnych w kilku edge case’ach. Warto puścić na swoim projekcie php -l i sprawdzić, czy nie masz deprecation notices – w PHP 8.x te rzeczy zostały usunięte.
4. Libsodium w corze – koniec z mcrypt
Jedną z najważniejszych zmian jest oficjalne włączenie biblioteki Sodium do rdzenia PHP (rozszerzenie sodium). Jednocześnie mcrypt został usunięty (deprecated już w 7.1). Jeśli masz stary kod szyfrujący dane opakowany w mcrypt_encrypt() – najwyższy czas na migrację:
<?php
// STARY KOD – mcrypt (usunięty w PHP 7.2!)
// $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
// NOWY KOD – sodium, bezpieczny i szybki
$key = sodium_crypto_secretbox_keygen(); // 32 bajty
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$encrypted = sodium_crypto_secretbox('Tajna wiadomość', $nonce, $key);
$decrypted = sodium_crypto_secretbox_open($encrypted, $nonce, $key);
echo $decrypted; // Tajna wiadomość
Jeśli prowadzisz sklep Magento i masz customowe moduły płatności lub integracje szyfrujące dane klientów – sprawdź to w pierwszej kolejności.
Podsumowanie
PHP 7.2 to solidna, ewolucyjna wersja. Nie rewolucjonizuje języka, ale zamyka kilka długo otwartych bolączek (sodium zamiast mcrypt, type hint object). Jeśli planujesz w przyszłości migrację na PHP 8.x, upgrade do 7.2 to dobry pierwszy krok – wymusisz usunięcie przestarzałego kodu, zanim zrobi to za Ciebie silnik.
