PHP 7 nadchodzi w tym roku, a wraz z tą wersją masa zmian i nowych funkcjonalności. Wprowadzone zostały nowości takie jak scalary type hinting, explicit return value type, spaceship operator, combined comparsion operatori wiele innych. W tym wpisie postaram się przedstawić najważniejsze zmiany i nowości w php7.

Dlaczego PHP 7, a nie PHP 6

Obecnie najnowszą wersją PHP jest 5.6, PHP 6 istniało w wersji eksperymentalnej od 2005 roku i zostało porzucone w 2010. Powstało wiele książek na temat PHP 6 dlatego też stworzono specjalne RFC, społeczność PHP zdecydowała, że mogło by powstać zamieszanie gdyby wersja PHP została wprowadzona jako 6, dlatego też zdecydowano w głosowaniu by nowa wersja PHP widniała z numerem siedem.

Więcej o powodach znajdziecie tutaj

Wydajność PHP 7

Twórcy PHP 7 chwalą się wydajnością 2x szybszą niż wcześniejsze wersje. Ale wiadomo jak to jest z benchmarkami, które są robione tak by wypadły jak najlepiej. Silnik PHP7 został przepisany. Został oparty na PHP NG(Next Generation). Twórcy chwalą się wzrostem wydajności od 20-70% bez przepisywania linii kodu. Wydajność PHP została zwiększona poprzez zmniejszenie ilości instrukcji procesora wymaganych do odpalenia aplikacji i tak np. strona główna  Wordpress-a wymagała 9.4 biliona operacji by się urchomić, a nowa wersja zmniejsza liczbę instrukcji do 2.6 biliona czyli 72% Na pewno PHP7 przyspieszy działanie aplikacji, jeśli użyjemy takich nowości jak np. określenie typu zwracanej wartości oszczędzi to pracę interpreterowi języka i aplikacja przyspieszy. Jak będzie zobaczymy, ja jestem dobrej myśli.

Więcej na https://www.zend.com/en/resources/php-7

Nowe funkcje języka PHP 7

W PHP 7 jest dość dużo nowości. Aby w pełni korzystać z języka i przyspieszyć aplikację powinniśmy użyć funkcji

declare(strict_types=1);

Linia ta musi być umieszona jako pierwsza i powoduje, że typy danych przekazywanych do metod, funkcji muszą być takie jak te zadeklarowane.

Przykład:

<?php

declare(strict_types=1);

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

function sumNew(int $a, int $b) : int
{
   return $a + $b;
}


echo sumOld("10 abc", 5); //dziala wynik 15 poniewż string jest castowany do 10
echo sumNew("10 abc", 5); //blad zly typ pierwszego argumentu
echo sumNew(10, 5); //wszystko ok wynik 15
echo sumNew("10", 5); //bląd zły typ pierwszego argumentu
echo sumOld("10", 5); //dziala wynik 15

Dzięki trybowi „strict” możemy wychwycić wiele błędów na etapie programowawnia. Koniec z żartami, że w c++ błedy wyłapuje kompilator a w PHP klient!

Spaceship operator

Statki kosmiczne wkraczają do PHP. Spaceship operator to nowy operator w PHP, który ułatwia nam porównywanie.Operator działa bardzo prosto. Załóżmy, że mamy zmienne $a oraz $b, instrukcja $a <=> $b zwróci nam -1 jeśli a jest mniejsze od $b, +1 jeśli $a jest większe niż $b lub 0 jeśli są równe. Jest to niezwykle przydatne w funkcjach sortujących wykorzystujących callbacki. Tym bardziej, że domyślnie działa na większości typów wbudowanych takich jak int, float, bool, array itp.

Przykład:

//PHP 5.6
function sortuj($a, $b) {
    return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}

// PHP 7
function sortuj($a, $b) {
    return $a <=> $b;
}

powyższy kod w obu przypadkach zwróci to samo, jednakże czytelność wzrasta.

Obsługa błedów

Tutaj zmiany są ogromne. Po pierwsze, mamy dwie rodziny wyjątków te wynikające z błędów programisty, który nie zabezpieczył kodu. Przykład to wywołanie metody na obiekcie który nie istnieje. Takie błędy mogą być łatwo obsłużone dzięki Engine Exceptions. Mamy teraz dostęp do wyjątków takich jak: \ParseException, \BaseException, \TypeException, \EngineException dzięki nim możemy w prosty sposób obsłużyć błedy aplikacji i odpowiednio na nie zareagować.

Null Coalescing Operator

Kolejna nowość to operator, który pozwala nam sprawdzić czy dana wartość jest nullem jeśli tak to zwróci domyśłną wartość, jeśli nie to zwróci wartość pod zmienną przykład:

<?php

$userId = $_GET['id'] ?? -1; //jesli nie jest przekazane ID w URL to $userId będzie równy -1


// bardziej zaawansowany przykład który w przypadku gdy artykuł o danym ID nie istnieje zwróci domyślny artykuł

$articleRepository = new ArticleRepository();
$page = $articleRepository->get($request->get('id')) ?? $articleRepository->getDefaultPage();

To by było na tyle w tym wpisie, w kolejnych postaram się przedstawić inne nowości w PHP 7. W ramach ciekawostki mogę napisać, że Symfony2 w nowej wersji jest w pełni kompatybilne z PHP7.

Tak więc drodzy programiści do pracy, w tym roku dwie gorące premiery PHP7 oraz Symfony2. Jeśli masz jakieś sugestie lub znalazłeś błąd to zapraszam do komentowania.