Opublikowanie wersji 5 języka PHP było sporym wydarzeniem w świecie fascynatów tej technologii. PHP5 umożliwiało pracę z obiektami, pełne wsparcie MySQL i poprawioną obsługę formatu XML. Dodatkowo, programiści PHP otrzymali narzędzie SOAP do tworzenia web service i warstwę wyjątków (Exceptions) wspierającą obsługę błędów.

Nowe funkcje w PHP5 zwanym po raz pierwszy PHP Obiektowym były rewolucyjne, ale w kontekście wielu konkurencyjnych języków wydawały się tylko „nadganianiem” oczywistych wymagań programowania. Wiele rozszerzeń, jak np. SOAP czy Exceptions były już spotykane powszechnie w C++, Java czy wręcz zostały napisane w C.

W toku pracy z PHP 5 narosło bardzo wiele życzeń i zażaleń względem formy pracy z obiektami, czy wydajności. Powstał autorski projekt o kodowej nazwie PHP Next Generation, który miał przezwyciężyć bolączki PHP5 szczególnie zauważalnych przy dużych, obciążonych aplikacjach.

Next Generation zastąpiło w PHP 7 przestarzały i mało wydajny silnik Zend II, na którym PHP opierało swój rozwój od wersji 4. Różnice były widoczne gołym okiem – wile benchmarków wykazało 40-50% wzrost wydajności i o wiele krótsze czasy wykonania skryptów i otrzymania odpowiedzi. Niektóre badania wykazują 50-procentowe różnice lub podwojenie możliwych do wykonania żądań.

Optymalizacja wydajności

W momencie opublikowania wersji 7.0, około 70% Internetu korzystało ze stron i sklepów opartych o PHP, a większość z nich to WordPress, Magento, PrestaShop i WooCommerce. Rezultaty benchmarków były oczywiste: wersja 7 daje kopa podobnego do Facebook’owego HHVM (HipHop Virtual Machine) opartego o JIT, który swego czasu był powodem do zazdrości.

W PHP 7 zreformowano strukturę zmiennych: zvals. W PHP 7 zvals nie przechowują już licznika referencji. Zamiast tego, tzw. refcount przechowywany jest przez wskazane przezeń struktury skomplikowane (tablice, obiekty, stringi). Struktura zvals (Zend values) uwolniona została od współczynnika referencji i dzięki temu wartości mogły być przechowywane i współdzielone niezależnie.

Return type declaration & nullable types

W PHP 7 pojawia się bardzo ważny element znany z innych języków: deklaracja zwracanego typu. Choć możemy deklarować jedynie podstawowe typy (int, bool, string, float, array) to jest to ogromny przeskok w unikaniu niepożądanych błędów i niespodzianek w wykonaniu funkcji. Dopiero wersja 7.1 i 7.2 pozwoliły na deklarowanie wartości typu iterable (interfejs Traversable) i object (zwracamy obiekt określonej klasy).

Deklarowanie zwracanego typu stało się obsesją programujących w PHP 7. Wielu przestawiło się na strict mode, by nauczyć się pracy z dokładnie określonym zwrotem funkcji. Zostaje pokonana jedna z największych bolączek PHP: niespodziewane zwrotki z funkcji. Co więcej, w PHP 7.1 pojawiają tzw. nullable types. Jeśli chcemy, by funkcja przyjmowała i/lub zwracała null lub typ (np. string), wystarczy przed deklaracją typu postawić znak zapytania: ?string.

Null coalescing operator & spaceship operator

Jeśli lubisz używać ternary operator (operatora trójdzielnego), z pewnością znasz tę sytuację, w której chciałbyś sprawdzić, czy zmienna jest w ogóle ustawiona (isset) i następnie czy ma wartość (is not null). Używając podwójnego znaku zapytania PHP sprawdzi ten przypadek za Ciebie 🙂

Natomiast tzw. spaceship operator umożliwia porównywanie wyrażeń wskazując, czy lewa strona operatora <=> jest większa, równa czy mniejsza od prawej. Należy tu brać pod uwagę podstawowe zasady porównywania typów i wartości.

Pozostałe nowości

  1. Funkcje void (PHP 7.3) – funkcja nie ma w założeniu zwracać żadnej wartości, zmienne mogą mieć podmienione wartości poprzez referencje
  2. Anonymous class – podobnie do C# czy Javy, w PHP możemy definiować tzw. klasy anonimowe, które z założenia mają być użyte tymczasowo, bez typowej architektury dziedziczenia czy dalszego przekształcania.
  3. Wsparcie architektury 64-bitowej dla przetwarzania naprawdę dużych liczb lub dużych plików oraz pracy z systemami 64-bitowymi.
  4. Typed properties (PHP 7.4) – możemy zadeklarować typ właściwości obiektu.
  5. Arrow functions (PHP 7.4) – znane dziś np. z Reacta arrow functions upraszczają stosowanie funkcji, które wykonują proste działania i nie wymagają złożonej deklaracji.

W skrócie ujmując różnice, PHP5 było swoistą rewolucją w PHP umożliwiając (w końcu) pracę z obiektami. Natomiast PHP 7 było solidnym rozwinięciem PHP5 w kontekście upodabniania PHP do innych języków obiektowych. Obecnie programiści PHP nie wyobrażają sobie pracy z dużymi aplikacjami bez intefejsów, traits czy overloadingu. PHP 7 nie było rewolucją, ale unormowaniem pracy z PHP jako językiem obiektowym. Jak pokaże PHP 8, wiele udogodnień czekało jeszcze na wprowadzenie do obiegu.