Jakie zmiany szykuje dla nas nowa wersja PHP?
Pierwsze główne wydanie PHP od ponad dziesięciu lat
Społeczność PHP jest bardzo podekscytowana powitaniem nowej wersji 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.
Dlaczego 7, a nie 6? Powiedzmy, że Unicode nie poszedł tak dobrze — podobnie jak w przypadku wielu projektów, wymagania nie były dobrze zdefiniowane i projekt został zatrzymany. Poza kodowaniem Unicode prawie wszystkie funkcje omawiane w PHP 6 zostały ostatecznie zaimplementowane w PHP 5.3 i nowszych. Po zaakceptowaniu zestawu funkcji dla głównego wydania postanowiono uniknąć pomyłki z martwym projektem i przejść od razu do wersji 7.
Co sprawia, że PHP 7 jest tak wyjątkowy? 6 nowych funkcji
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ść dwa razy wyższą niż PHP 5.6. Wyniki te nie są gwarantowane dla każdego projektu, ale w przypadku wydajności CMS WordPress szybkość jest zauważalna gołym okiem.
2. Deklaracje dla typów skalarnych
Deklaracja typu oznacza określenie, jaki typ zmiennej jest ustawiany, zamiast zezwalania PHP na automatyczne ustawianie tego. PHP jest uważany za słabo typowany język — zmienne mają powiązane typy danych, ale można robić rzeczy takie jak dodawanie ciągu do liczby całkowitej bez błędu. Deklaracje typu pomagają zdefiniować, co powinno się wydarzyć, i ułatwiają czytanie kodu.
Przykład — funkcja do rejestracji studentów, wymagająca obiektu klasy Student i tablicy kierunków:
function rejestracja(Student $student, array $kierunki) {
foreach ($kierunki as $kierunek) {
echo "Rejestracja " . $student->imie . " na kierunku " . $kierunek;
}
}
Próba przekazania samego imienia zamiast obiektu zwróci błąd krytyczny:
rejestracja("imie", array("kierunek 1", "kierunek 2"));
Wskazówki typu skalarnego
W PHP 7 dodane zostały typy skalarne — deklarować można string, int, float oraz boolean. Domyślnie skalarne deklaracje typu (coercive) pozwalają na rzutowanie: jeśli przekażesz ciąg zaczynający się od liczby do funkcji wymagającej float, PHP pobierze liczbę z początku i odrzuci resztę.
function suma(float $a, float $b) {
return $a + $b;
}
suma(2, "1 przykład"); // 3.0, z ostrzeżeniem
suma(2.8, "3.2"); // 6.0
PHP 7 daje też możliwość włączenia trybu restrykcyjnego (strict) — przez dodanie declare(strict_types=1); jako pierwszej linii pliku. Wtedy każda niezgodność typu zwraca błąd krytyczny zamiast rzutowania:
declare(strict_types=1);
function suma(float $a, float $b) {
return $a + $b;
}
suma(2, "1 przykład"); // Fatal error: Argument 2 must be of type float, string given
suma(2.5, 1); // OK, zwraca float(3.5) — int jest "poszerzany" do float
3. Deklaracje dla typów zwracanych
PHP 7 obsługuje też deklaracje typów zwracanych, dodawane po dwukropku przed otwierającym nawiasem klamrowym:
function suma(float $a, float $b): float {
return $a + $b;
}
Ułatwia to upewnienie się, że funkcja zwraca dokładnie to, czego oczekujemy.
4. Obsługa błędów
Wcześniej obsługa błędów krytycznych była w PHP prawie niemożliwa — błąd krytyczny po prostu zatrzymywał skrypt, co na produkcji oznaczało pusty biały ekran. W PHP 7 można przechwytywać błędy krytyczne tak jak inne wyjątki. Zarówno Error, jak i Exception implementują nową klasę Throwable, więc bloki catch-all powinny łapać Throwable zamiast Exception.
5. Nowe operatory
PHP 7 wprowadza dwa nowe operatory:
- Spaceship (
<=>) — zwraca-1,0lub1w zależności od tego, która strona porównania jest większa. - Null coalescing (
??) — zwraca wartość po lewej stronie, jeśli jest inna niżNULL, w przeciwnym razie wartość po prawej — bez zgłaszania powiadomienia, gdy lewy operand nie istnieje.
6. Grupowanie deklaracji use
Klasy, funkcje i stałe z tej samej przestrzeni nazw można teraz pogrupować w jednym use:
// PHP 5+
use App\Blog\Post;
use App\Blog\Author as User;
use App\Blog\Comment;
// PHP 7
use App\Blog\{Post, Author as User, Comment};
Podsumowanie
PHP 7 wprowadza wiele przełomowych funkcjonalności, cieszy się zauważalnym skokiem wydajności i ograniczeniem zużycia pamięci. Trzeba jednak pamiętać, że część funkcjonalności została wycofana, co może powodować problemy przy migracji ze starszych wersji.