Pierwsze główne wydanie PHP od ponad dziesięciu lat.

Społeczność PHP jest BARDZO podekscytowana powitaniem nowa wersja PHP, ale to nie znaczy, że PHP cały czas było w zastoju. Wręcz przeciwnie, drobne wersje PHP 5 przyniosły wiele ciekawych funkcji, w tym obsługę programowania zorientowanego obiektowo i wiele funkcji z tym związanych.

Dlaczego 7, a nie 6? Powiedzmy, że unicode nie poszło tak dobrze. Podobnie jak w przypadku wielu projektów, wymagania nie były dobrze zdefiniowane, a ludzie nie mogli się zgodzić na różne rzeczy, więc projekt został zatrzymany. Poza kodowaniem Unicode, do kodowania znaków specjalnych i międzynarodowych, prawie wszystkie funkcje omawiane w PHP 6 zostały ostatecznie zaimplementowane w PHP 5.3 i nowszych, więc naprawdę nie przegapiliśmy niczego innego. Dzięki temu wiele rzeczy zostało nauczonych i wprowadzono nowy proces składania zapytań. Po zaakceptowaniu zestawu funkcji dla głównego wydania postanowiono uniknąć pomyłki z martwym projektem i przejść do wersji 7 najnowszej wersji.

Co sprawia, że ​​PHP 7 jest tak wyjątkowy? 6 nowych funkcji w PHP 7

Przyjrzymy się sześciu najważniejszym funkcjom jakie dostarczy PHP 7. Zmian jest znacznie więcej, ale skupimy się według mnie na najważniejszych.

1. Prędkość

Programiści bardzo ciężko pracowali nad poprawą kodu PHP, aby zmniejszyć zużycie pamięci i zwiększyć wydajność, i na pewno im się to udało.

Benchmarki dla PHP 7 konsekwentnie pokazują prędkości dwa razy wyższą niż PHP 5.6! Chociaż wyniki te nie są gwarantowane dla wszystkich projektów, ponieważ każdy projekt jest inny to w przypadku wydajności CMS WordPress szybkość jest zauważalna „gołym okiem”.

W popularnym benchmarku, polegającym na generowaniu zbioru Mandelbrota, najnowsza wersja PHP okazuje się bić na głowę języki takie jak: Python, Ruby czy Perl.

2. Deklaracje dla typów skalarnych

Deklaracja typu oznacza po prostu określenie, jaki typ zmiennej jest ustawiany, zamiast zezwalania PHP na automatyczne ustawianie tego. PHP jest uważany za słabo napisany język. W istocie oznacza to, że PHP nie wymaga deklarowania typów danych. Zmienne nadal mają powiązane typy danych, ale możesz robić radykalne rzeczy, takie jak dodawanie ciągu do liczby całkowitej, bez powodowania błędu. Deklaracje typu mogą pomóc w zdefiniowaniu, co powinno się wydarzyć, aby uzyskać oczekiwane rezultaty. Może to również ułatwić czytanie kodu. Wkrótce przyjrzymy się konkretnym przykładom.

Od PHP 5, możesz użyć podpowiedzi typu, aby określić oczekiwany typ danych argumentu w deklaracji funkcji, ale tylko w deklaracji. Po wywołaniu funkcji PHP sprawdzi, czy argumenty są określonego typu. Jeśli nie, spowoduje błąd i wykonanie zostanie zatrzymane. Do pojawienia się PHP 7, ograniczaliśmy się zasadniczo do 2 typów: deklaracja dla klas oraz tablic.

Oto przykład:

Gdybyśmy stworzyli funkcję do rejestracji studentów, moglibyśmy wymagać, aby pierwszy argument był obiektem klasy Student, a drugi argument tablicą kierunków studiów.

function rejestracja(Student $student, array $kierunki) {
    foreach ($kierunki as $kierunek) {
        echo "Rejestracja " . $student->imie . " na kierunku " . $kierunek;
    }
}

Gdybyśmy próbowali przekazać tylko imię studenta zamiast obiektu, otrzymalibyśmy błąd krytyczny.

rejestracja("imie", array("kierunek 1", "kierunek 2"));

Gdybyśmy przekazali pojedynczy kierunek zamiast tablicy, otrzymalibyśmy również błąd.

rejestracja($student, "kierunek");

Musimy przekazać obiekt studenta i tablicę kierunków.

rejestracja($student, array("kierunek 1", "kierunek 2"));

Wskazówki typu skalarnego

W PHP 7 dodane zostały typy skalarne, deklarowane będą mogły być łańcuchy znaków (string), liczby całkowite (int) i zmiennoprzecinkowe (float) oraz typy logiczne (boolean).

Dodając wskazówki typu skalarnego i umożliwiając spełnienie surowych wymagań, mamy nadzieję, że można będzie napisać bardziej poprawne i samodokumentujące się programy PHP. Zapewnia także większą kontrolę nad kodem i może ułatwić odczytanie kodu.

Domyślnie skalarne deklaracje typu (coercive) pozwalają na rzutowanie, co oznacza, że ​​będą próbować zmienić typ oryginalny, aby pasował do typu określonego przez deklarację typu. Innymi słowy, jeśli przekażesz ciąg zaczynający się od liczby do funkcji, która wymaga argumentu zmiennoprzecinkowego, pobierze liczbę znajdującą się na początku i usunie wszystko inne. Przekazanie argumentu typu float do funkcji, która wymaga int, wykona się konwersja typów i stanie się int(1).

Przykład:

Stwórzmy funkcję zwracającą wynik dodawania dwóch liczb zmiennoprzecinkowych.

function suma(float $a, float $b) {
    return $a + $b;
}

Więc, kiedy wywołujemy funkcję suma z typami danych int oraz string, PHP konwertuje je na zmienne typu float. Pierwszy argument zostanie zmieniony na 2.0, a drugi argument zostanie zmieniony na 1.0, wynikiem bedzie 3.0. Otrzymasz jednak ostrzeżenie.

suma(2, "1 przykład");

W kolejnym przykładzie, ciąg 3.2 zostanie zmieniony na float i otrzymamy wynik równy 6.

suma(2.8, "3.2");

Następny przykład zawiera argument zmiennoprzecinkowy oraz liczbę całkowitą, która zostanie zmieniona na typ float.

suma(2.5, 1);

Dodatkowo PHP 7 daje nam możliwość włączenia trybu restrykcyjnego (strict). Robimy to przez dodanie na górze każdego pliku declare(strict_types=1); MUSI to być pierwsza linia, nawet przed przestrzeniami nazw. Deklarowanie restrykcyjnego sprawdzania zapewni, że wszystkie wywołania funkcji wykonane w tym pliku będą ściśle porównywane z określonymi typami argumentów.

Jeśli wystąpi niezgodność deklaracji typu, generowany jest błąd krytyczny „Fatal Error” i wiemy, że coś nie działa zgodnie z oczekiwaniami.

Przykład:

Użyjemy tej samej funkcji co w poprzednim przykładzie z włączonym trybem strict.

declare(strict_types=1);

function suma(float $a, float $b) {
    return $a + $b;
} 

Dla dwóch pierwszych przypadków zostanie zwrócony błąd ze względu na typ przekazanych zmiennych.

suma(2, "1 przykład"); // Fatal error: Uncaught TypeError: Argument 2 passed to suma() must be of the type float, string given  
suma(2.8, "3.2"); // Fatal error: Uncaught TypeError: Argument 2 passed to suma() must be of the type float, string given 

Trzeci przypadek zostanie zaakceptowany przez interpreter i zostanie wykonane „poszerzenie” dodając 0 do argumentu drugiego.

suma(2.5, 1); // returns float(3.5)

3. Deklaracje dla typów zwracanych

PHP 7 obsługuje również deklaracje typów zwracanych, które obsługują wszystkie te same typy co argumenty funkcji. Aby określić typ zwracany, dodajemy dwukropek, a następnie typ bezpośrednio przed otwierającym nawiasem klamrowym.

function suma(float $a, float $b) : float {
     return $a + $b;
}  

Jeśli określimy typ float, będzie on działał dokładnie tak, jak w poprzednich 2 przykładach, ponieważ zwracany typ był już zmiennoprzecinkowy. Dodanie typu zwracanego pozwala upewnić się, że funkcja zwraca to, co jest oczekiwane, a także ułatwia zobaczenie, jak działa ta funkcja.

Deklaracje dla typów zwracanych, podobnie jak dla typów skalarnych posiadają dwa tryby: coercive – dopuszczającym rzutowanie oraz strict – tylko dokładny typ, konfigurowane analogicznie jak w poprzednim przypadku.

4. Obsługa błędów

Kolejną funkcją, którą omówimy, są zmiany w obsłudze błędów. Obsługa błędów krytycznych w przeszłości była prawie niemożliwa w PHP. Błąd krytyczny nie wywołuje procedury obsługi błędów tylko po prostu zatrzymuje skrypt. Na serwerze produkcyjnym oznacza to zwykle wyświetlanie pustego białego ekranu, który dezorientuje użytkownika i powoduje utratę wiarygodności. Może również powodować problemy z zasobami, które nigdy nie były poprawnie zamknięte i nadal są w użyciu.

W PHP 7 istnieje możliwość przechwytywania błędów krytycznych i obsługiwania ich tak jak pozostałe wyjątki. Błędy krytyczne nadal istnieją dla pewnych warunków, takich jak brak pamięci i nadal zachowują się jak wcześniej, natychmiast zatrzymując skrypt. Nieprzechwycony wyjątek nadal będzie błędem krytycznym w PHP 7. Oznacza to, że jeśli wyjątek zgłoszony z powodu błędu, który był fatalny w PHP 5, nie zostanie przechwycony, nadal będzie to błąd krytyczny w PHP 7. Chcę podkreślić, że inne typy błędów, takie jak ostrzeżenia i powiadomienia, pozostają niezmienione w PHP 7.

W PHP 7, wyjątki Error i Exception implementują nową klasę Throwable. Oznacza to, że w zasadzie działają w ten sam sposób. Ponadto możesz teraz użyć Throwable w blokach try/catch, aby przechwytywać zarówno obiekty Exception, jak i Error. Pamiętaj, że lepiej jest łapać więcej określonych klas wyjątków i odpowiednio się nimi posługiwać. Jednak niektóre sytuacje wymagają wychwycenia dowolnego wyjątku (takiego jak rejestrowanie lub obsługa błędów ram). W PHP 7 bloki catch-all powinny wychwytywać Throwable zamiast Exception.

5. Nowe operatory

PHP 7 przynosi nam także dwa nowe operatory, które pozwalają łatwiej przeprowadzać typowe operacje, spaceship oraz null coalescing.

Operator Spaceship

Pierwszym, który zbadamy, jest operator Spaceship inaczej Combined Compare, operator ten jest miłym dodatkiem do języka, uzupełniając operatory większy, równy i mniejszy.

<=>

Jak on działa? Bardzo prosto: zwraca -1 gdy prawa strona jest większa, 0 gdy są takie same oraz 1 gdy lewa strona jest większa od prawej.

Operator null coalescing

Innym nowym operatorem, jest legendarny już if-set-or czyli ??. Zwróci wartość po lewej stronie, jeśli jest inna niż NULL, w przeciwnym razie zwróci wartość znajdującą się po jego prawej stronie. Ważną rzeczą jest to, że nie podniesie powiadomienia, jeśli lewy operand jest nieistniejącą zmienną.

6. Grupowanie deklaracji use

Klasy, funkcje i stałe importowane z tej samej przestrzeni nazw można teraz pogrupować w jedno use.

// PHP5+ 
use App\Blog\Post; 
use App\Blog\Author as User; 
use App\Blog\Comment; 

// PHP7 
use App\Blog\{Post, Author as User, Comment}; 

Podsumowanie

Niewątpliwe nowy PHP 7 wprowadza wiele przełomowych funkcjonalności, cieszy się również zauważalnym skokiem wydajności i ograniczeniem zużycia pamięci. Nowe funkcje wprowadzają język na wyższy poziom, co pozwala programistom lepiej wykorzystać jego możliwości.

Trzeba też wspomnieć, że spora część funkcjonalności została wycofana w nowej wersji PHP, co może spowodować problemy podczas przechodzenia ze starszej wersji do PHP 7. W takich przypadkach na pewno będzie potrzebna pomoc programisty w celu aktualizacji kodu.