PHPCenter.pl - Twoje Centrum Informacji - PHP, Wydarzenia, Artykuły, Oferty pracy
Twoje Centrum Informacji
PHP, Artykuły, Meetupy, Oferty pracy

PHP 7.4 – Co nowego?

PHP 7.4 jest już w fazie RC, a data premiery ustalona została na 29 listopada 2019. Nowa wersja PHP wprowadza wiele nowych funkcjonalności i ciekawych rozwiązań, które mają ułatwić nasze codzienne kodowanie. W związku z premierą, która odbędzie się za dwa miesiące, przyjrzyjmy się niektórym zmianom.

Lista zmian opisanych w tym artykule:

Array Spread Operator

Od wersji PHP 5.6 mamy do dyspozycji Array Spread Operator..., dzięki któremu możemy spakować lub rozpakować wszystkie argumenty funkcji w jedną zmienną, np:

function func(...$args) {
    var_dump($args);
}
func(1, 2, 3, 4);

W zmiennej $args będą znajdować się wszystkie argumenty przesłane do funkcji podczas jej wywoływania, w formie tablicy.

W PHP 7.4 operator ... może być używany również do pakowania i rozpakowywania tablic. Do tej pory, aby połączyć tablice potrzebowaliśmy funkcji array_merge() lub operatora +, teraz to samo można wykonać w taki sposób:

$source = [1, 2];
$result = [...$source, 3, 4];

Użycie operatora ... powoduje „rozpakowanie” tablicy w miejscu użycia. Przydatne w momencie, gdy chcemy dodać na początku lub na końcu tablicy dodatkową wartość, zamiast używać array_push() czy array_unshift().

Zwiększona wydajność kodu

Używanie operatora ... w niektórych przypadkach może okazać się bardziej wydajne, ponieważ jest on częścią języka (a nie funkcją jak array_merge()), i struktura taka może być optymalizowana podczas kompilowania.

Operator ten może być używany wielokrotnie w jednym wyrażeniu. Dla przykładu, można połączyć kilka różnych tablic, w dowolnej kolejności.

$result = [...$vegetables, 'carrot', ...$fruits, 'banana'];

Array Spread Operator działa również z funkcjami. W sytuacji gdy funkcja zwraca tablicę, możliwe jest „wstrzyknięcie” zwróconej tablicy do innej.

$result = [...getVegetables(), 'carrot', ...getFruits(), 'banana'];

Gdy funkcja używa generatora, również można użyć jej z operatorem ....

function getUsingGenerator() {
    for ($i = 0; $i <= 3; $i++) {
        yield $i;
    }
}

$result = [...getUsingGenerator(), 4, 5];

Niemożliwe jednak jest rozpakowywanie tablic używając referencji do nich.

$result = [...&$array];

RFC

Pełny dokument RFC opisujący Array Spread Operator, dostępny jest pod adresem: https://wiki.php.net/rfc/spread_operator_for_array

Arrow Functions 2.0

Funkcje anonimowe są dostępne w PHP już od bardzo dawna, jednak do tej pory definiowanie takiej funkcji oznaczało pisanie długiego (relatywnie) kodu. W PHP 7.4 możemy krótkie funkcje (jednolinijkowce) zamienić na Arrow Function. Dla przykładu, poniższe dwie funkcje są takie same.

$func = function($arg) {
    return $arg * 2;
}

$func = fn($arg) => $arg * 2;

Ilość kodu jest zdecydowanie zmniejszona. Funkcje w takiej formie można używać bezpośrednio w argumentach callback wywołań innych funkcji.

$source = [1, 2, 5, 8];
$result = array_map(fn($a) => $a * 2, $source);

Do tej pory, aby móc w funkcji anonimowej użyć zmiennej zadeklarowanej w danym scope (pomijając $this), musieliśmy użyć wyrażenia use. W PHP 7.4 podczas używania Arrow Functions, zmienne ze scope nadrzędnego są automatycznie bindowane do tej funkcji, jednak tylko przez ich wartość (implicit by-value scope binding). Oznacza to, że nie można zmienić wartości zmiennej scope nadrzędnego, w Arrow Function. Poniższe dwie funkcje są zatem tożsame.

$operand = 2;

$func = function($arg) use ($operand) {
    return $arg * $operand;
}

$func = fn($arg) => $arg * $operand;

RFC

Pełny dokument RFC opisujący Arrow Functions 2.0, dostępny jest pod adresem: https://wiki.php.net/rfc/arrow_functions_v2

Null Coalescing Assignment Operator

W PHP 7.0 dostaliśmy operator ??, dzięki któremu mogliśmy zmniejszyć ilość kodu, gdy sprawdzaliśmy za pomocą isset() czy zmienna istnieje. Poniższe wyrażenia są zatem tożsame.

$source['key'] = isset($source['key']) ? $source['key'] : 'default';
$source['key'] = $source['key'] ?? 'default';

Nowy operator przypisania – ??= – jeszcze bardziej skraca to wyrażenie.

$source['key'] = $source['key'] ?? 'default';
$source['key'] ??= 'default';

Operator sprawdza czy zmienna (klucz tablicy) po lewej stronie operatora istnieje (nie jest null), jeśli tak to pozostawia go bez zmian, w innym przypadku przypisuje do niej wartość po prawej stronie operatora.

Podsumowując – operator ?? jest operatorem porównania, a operator ??= jest operatorem przypisania.

RFC

Pełny dokument RFC opisujący Null Coalescing Assignment Operator, dostępny jest pod adresem: https://wiki.php.net/rfc/null_coalesce_equal_operator

Typed Properties 2.0

Typowanie argumentów funkcji (type hinting) jest dostępne w PHP już od jakiegoś czasu, a z wersją PHP 7.4 dostajemy do dyspozycji również możliwość definiowania typu właściwości klasy. Typem właściwości może być każdy typ danych używany dla argumentów funkcji, z wyłączeniem void i callable.

class Class {
    public int $scalar;
    protected ClassName $class;
    private ?ClassName $nullableProperty;
}

Typowanie może być używane również na właściwościach statycznych oraz w przypadku deklarowania wielu właściwości w pojedynczej deklaracji.

W przypadku przypisania wartości o nieprawidłowym typie, wyrzucony zostanie Fatal Error.

RFC

Pełny dokument RFC opisujący Typed Properties 2.0, dostępny jest pod adresem: https://wiki.php.net/rfc/typed_properties_v2

Covariant Returns and Contravariant Parameters

Do tej pory podczas deklarowania typów argumentów i zwracanych wartości, klasa podrzędna musiała respektować deklaracje klasy nadrzędnej (lub interfejsu) podczas nadpisywania metod. Jeśli metoda klasy A (rodzic) zwracała obiekt klasy Z, to metoda klasy B (dziecko) również musiała zwrócić obiekt klasy Z. To samo tyczy się typów parametrów metod.

interface UserFactory {
    function make(): UserInterface;
}

class DefaultUserFactory implements UserFactory {
    function make(): UserInterface;
}

W PHP 7.4 możemy zmieniać te typy pomiędzy mocniej/mniej szczególnymi. Covariant Returns umożliwia zwrócenie bardziej szczegółowego typu danych przez metodę klasy dziedziczącej.

interface UserFactory {
    function make(): UserInterface;
}

class DefaultUserFactory implements UserFactory {
    function make(): AdvancedUserInterface;
}

Contravariant Parameters natomiast umożliwia przyjęcie parametru klasy/typu nadrzędnego, w porównaniu do klasy rodzica. Dla przykładu, interfejs wymaga przyjęcia obiektu klasy Iterator, ale my potrzebujemy przyjąć każdy rodzaj iteratora, przez typehint iterable.

interface Concatable {
    function concat(Iterator $list); 
}

class Collection implements Concatable {
    function concat(iterable $list);
}

RFC

Pełny dokument RFC opisujący Covariant Returns and Contravariant Parameters, dostępny jest pod adresem:
https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters

Preloading

PHP od dawna daje możliwość używania OPcache do przyspieszania aplikacji. Teraz będzie można przyspieszyć ją jeszcze bardziej, dodając pliki modułów/frameworków do OPcache za pierwszym startem serwera, by zostały sparsowane i zapisane w pamięci do późniejszego użycia. Zapisany w taki sposób kod będzie mógł być reużywalny dla wszystkich requestów, bez potrzeby parsowania plików za każdym razem.

Lista plików, które mają zostać dodawane do takiego preloadera, znajdować mają się w pliku php.ini w dyrektywie opcache.preload. Dzięki temu, przy starcie PHP, zapisze je i będzie używał aż do momentu kolejnego restartu.

W przypadku powstania zmian w tych plikach, będzie trzeba zrestartować PHP by na nowo sparsował i zapisał pliki do Cache.

RFC

Pełny dokument RFC opisujący Preloading, dostępny jest pod adresem:https://wiki.php.net/rfc/preload

Pełna lista zmian

Lista zmian jest o wiele większa, przedstawiłem tylko te ważniejsze. Pełną listę zmian, w tym deprecations, znajdziecie w tym dokumencie: https://github.com/php/php-src/blob/PHP-7.4/UPGRADING

Podsumowanie

PHP 7.4 jest kolejnym krokiem rozwoju języka PHP, w którym dodawane są nowe funkcjonalności i rozwiązania, które mają ułatwić nasze codzienne kodowanie. Oprócz tych zmian, zapowiadane są oczywiście zmiany zwiększające szybkość działania aplikacji. Już niedługo powinniśmy poznać wykresy wydajności tej gałęzi, zalecam jednak poczekać na premierę, ponieważ wprowadzone poprawki kodu mogą mieć wpływ na ostateczną wydajność.

A na horyzoncie widać już statek z PHP 8! Będzie się działo!

12000cookie-checkPHP 7.4 – Co nowego?
A co tam, udostępnij:
avatar
  Subscribe  
Powiadom o
Podoba Ci się to co czytasz, chcesz więcej treści od phpcenter.pl?
×
Wyszukaj