blog.michalt.pl

Niedługo stabilne PHP 8 – czy nasze drogi się zejdą?

17.08.2020 22:07 - Tech

Czas szybko leci. Pamiętam jakby to było wczoraj – rewolucyjne wydanie PHP w wersji 7.0, które miało miejsce niecałe 5 lat temu. Dla mnie wówczas najistotniejszą nowością było typowanie. Podpowiadanie typów obiektowych obecne było już we wcześniejszych wersjach, ale siódemka dorzuciła typy podstawowe. Ponadto, w tej wersji pehap mocno przyśpieszył.

Nowości już od samego 7.0 było o wiele więcej, m.in.: klasy anonimowe, spaceship operator, null coalesce operator, znane programistom języka Go grupowanie importów itd. Z czasem moje drogi z PHP się rozeszły.

Czy ósemka to zmieni? Myślę, że nowości raczej o tym nie zadecydują.

Wspomnę więcej na ten temat w jednym z następnych wpisów. ;)


Postanowiłem skompilować pierwszą wersję beta PHP 8.0.0 i pobawić się. Coś pokodziłem, coś poczytałem i coś dla Was napisałem. :)

PHP 8.0 - phpinfo

Jeśli nie chce Wam się bawić w apache, nginxy i inne ciurululanie tylko po to by się pobawić i potestować, polecam po skompilowaniu uruchomić binarkę z argumentami: -S localhost:1234, gdzie 1234 to wybrany przez Was numer portu – oczywiście można wybrać inny.



Just In Time?

W nadchodzącym wydaniu mamy mieć do czynienia z kompilacją wykonywanych fragmentów PHP w locie do kodu maszynowego. Przypuszczam, że całość aplikacji będzie kompilowana do bytecode, a wykonywane kawałki do kodu maszynowego.



Union types

Gmerania w typowani ciąg dalszy… W tym urokliwym rozwiązaniu atrybut klasy, argument funkcji lub metoda, a także zwracane wartości przez metody i funkcje mogą mieć zadeklarowane wiele typów.

Podsumowując i upraszczając: możemy sobie zażyczyć, aby funkcja lub metoda, przyjmowały w argumencie lub zwracały np. napis oraz wartość całkowitoliczbową i nic ponadto.

Przykład poniżej:


PHP 8.0 - union types


Zwróćcie uwagę na to, że możemy również zwracać konkretne wartości – ale dotyczy to jedynie typów boole’owskich i wartości null.


PHP 8.0 - union types



Ujemne indeksy w tablicach i weak maps

Od ósemki będziemy mogli indeksować tablice począwszy od liczb ujemnych – wiem, dziwne… Pojawią się również słabe mapy (ekmhm :D weak maps), które w kluczu będą wykorzystywać obiekty będące słabymi referencjami.

Czym są słabe referencje?

Tradycyjne silne referencje utrzymują przy życiu obiekt, aż do momentu w którym będą istnieć do niego odniesienia (referencje), w przypadku słabych niekoniecznie – np. gdy zabraknie pamięci, odśmiecacz pamięci może skasować obiekt posiadający istniejące referencje.



Match

PHP 8.0 - konstrukcja match

Działa jak switch, ale nie wymaga stosowania breaków, a syntaktycznie nieco przypomina mapę.

Konstrukcja match zwraca wartość na podstawie podanego argumentu. Jeśli nie nastąpi dopasowanie, wywołany zostanie wyjątek UnhandledMatchError. W przeciwieństwie do mapy, do jednego odniesienia do wartości może prowadzić kilka kluczy.



Nazwane argumenty

PHP 8.0 - nazwane argumenty

Tu za wiele wyjaśniać nie trzeba. Po prostu, przy użyciu etykiet możemy zdecydować o kolejności wprowadzanych argumentów dla funkcji.



Atrybuty klasy jako parametry konstruktora

Jest to rozwiązanie, które może nieco zaciemniać kod, chociaż…
Zamiast wypisywać listę atrybutów w klasie, możemy ująć ją jako listę argumentów konstruktora wraz z modyfikatorami dostępu. Pozwala to zaoszczędzić ilość kodu.

PHP 8.0 - parametry konstruktora



Jest tego więcej…

Pojawiły się m.in. znane z języka Java adnotacje, nullsafe operator i kilka nowych funkcji, a także możliwość zwracania statycznej instancji nowego obiektu. Czy nowości mnie urzekły? Hmmm… Nie wiem…

Nigdy (w przeciwieństwie do większości programistów) nie podchodziłem do języków programowania jak do religii. Dla mnie to wyłącznie narzędzie. Czy PHP 8 jest lepszym? Zapewne z powodu kompilacji JIT. Pozostałe rozwiązania, za wyjątkiem konstrukcji match, wydają mi się lekko przekombinowane. Jestem zwolennikiem prostych syntaktycznie i restrykcyjnych typowo języków.

Myślę jednak, że w niedalekiej przyszłości zetknę się z PHP 8 znacznie bardziej i nie będę z tego powodu płakał.

PHP 8.0.0 beta 1 możecie pobrać stąd: https://downloads.php.net/~carusogabriel/