PHP7 – typizacja zmiennych i większa wydajność

O ile data wypuszczenia oficjalnej stabilnej wersji PHP 7 to początek grudnia ubiegłego roku, to własciwie dopiero wczoraj skompilowałem u siebie siódemkę i muszę przyznać, że czas przerzucić się ze wszystkimi projektami na tę wersję.

Okay, ale co się stało z PHP6?

No cóż, prace nad php w wersji szóstej rozpoczęły się już dawno temu, niestety sami twórcy stwierdzili, że nie zasługuje na oficjalny release, ze względu na zbyt duże komplikacje w związku z unicodem – które to ta wersja własnie miała naprawić. No cóż, w związku z powyższym twórcy stwierdzili, że repo PHP6 jest już zbyt zaśmiecone i postanowili je porzucić na poczet kolejnej dużej wersji.

Nie obeszło się oczywiście bez dyskusji na temat nazewnictwa kolejnej wersji, natomiast społeczeństwo zadecydowało, żeby przeskoczyć rewizję szóstą i przeskoczyć od razu do 7-ki (ciekawy artykuł na ten temat można znaleźć tutaj). Jednym słowem można powiedzieć, że pozostawiono nieukończony projekt jako pewnego rodzaju przestrogę 🙂

Nowości

Wszystkie nowości odnaleźć można na wielu stronach poświęconych PHPowi, przede wszystkim na oficjalnym php.net, gdzie przedstawione zostały na przykładach zmiany wprowadzone do tej iteracji.

Deklaracja typów skalarnych

Jako największą zmianę, moim zdaniem, można potraktować deklarację typów skalarnych. Na szczęście / nieszczęście nie jest standardowo włączona, a żeby jej używać, musimy każdorazowo w danym pliku (sic!) zadeklarować, że będziemy używać strict_types . Zostało to wprowadzone aby zapewnić używanie strict’a w nowo tworzonym kodzie, ale żeby jednocześnie mieć możliwość korzystania z zewnętrznych i nieco starszych bibliotek, które w momencie ich pisania, nie miały pojęcia o php7. Warto pamiętać, że strict tyczy się tylko i wyłącznie danego pliku, a nie na przykład funkcji w nim zdefiniowanej:

W powyżrzym przykładzie jeżeli z pliku foo.php będę odwoływał się do funkcji foo()  i jako parametr podam coś innego niż Integer, dostanę fatal error, że zadeklarowany typ różni się od wprowadzonego. Natomiast jeżeli utworzę plik bar.php, do którego załączę poprzednio utworzony:

W takim przypadku String  zostanie zrzutowany na Int'a  i funkcja wywoła się prawidłowo.

Kosmiczny operator

Kolejną ciekawą rzeczą jest spaceship operator, który najlepiej przedstawić na przykładzie:

Jednym słowem operator wskazuje nam, która wartość (lewa / prawa) jest większa, lub czy są sobie równe. Wcześniej można było osiągnąć to w ten sposób:

Null coalescing operator

Operator łączący wartość null [??], jego konstrukcja jest bardzo zbliżona do operatora warunkowego (ternary operator [?:]), z tą różnicą że  zwraca argument operacji z lewej strony, jeśli ma on wartość inną niż null, w przeciwnym razie zwraca argument operacji po prawej stronie. Dodatkowo przy pomocy tego operatora zostanie zwrócona wartość po jego prawej stronie, jeżeli zmienna z jego lewej strony nie istnieje / nie została zadeklarowana.

Grupowanie delegacji use

W php7 w końcu można pogrupować use  leżące w obrębie jednego namespace’a, dla przykładu chcąc zadeklarować wszystkie wymagane klasy dla opisywanego ostatnio routera wystarczyłoby podać:

Tablice jako stałe

Zawsze brakowało mi możliwości zdefiniowania tablicy jako stałej. Zawsze próbowałem obejść to albo serializując i deserializując dane przypisane do stałej, albo budowało się tablicę złożoną ze stałych, która to tablica była już zmienną… Na szczęście od teraz define  wspiera już tablice:

Wydajność

Najnowsza dystrybucja PHP jest dużo szybsza od ostatniej piątki, na co wskazują liczne benchmarki, do których odsyłam:

Podsumowanie

To tylko kilka z nowości, ale już na pierwszy rzut oka widać, że bardzo przydatnych w codziennej pracy.Pełną ich listę znajdziecie w RFC. Dużo szybsze działanie z pewnością da się odczuć w większości projektów opartych na PHP, a definiowanie typów zmiennych oraz zwracanych waartości przez funkcje, niejednokrotnie będzie mogło uchronić przed nieoczekiwanymi problemami z przetwarzaniem danych.

Na koniec warto zerknąć na proces migracji do PHP7, który powinien sprawić, aby przejście na kolejną wersję PHP było jak najmniej bolesne.