PHP7 - Type Hints & Return Types

Łukasz Piotrowski Komentarzy 0

    PHP7 wprowadza wiele nowinek i smaczków do języka które już były znane w innych. Omawiałem już Anonymouse Class, Operator <=> oraz Grupowanie "use".

    Dziś zajmiemy się kolejnym mega feature który pozwala nam na jeszcze większą kontrolę nad tym co piszemy i czego oczekujemy: Type Hints oraz Return Types.

    Do dzieła...


    Type Hint

    Po staremu

    Type Hint było już obecne w PHP5 ale ograniczało się tylko do kilku przypadków. Do tej pory stosowaliśmy w metodach Hints w postaci nazw klas np:

    <?
    
    class ConcreteStrategy
    {
        public function make()
        {
        }
    }
    
    class Strategy {
        public function setStrategy(StrategyInterface $strategy)
        {
            # code...
        }
    }
    
    (new Strategy)->setStrategy(new ConcreteStrategy);

    Dzięki takiemu zapisowi mamy pewność że do metody setStrategy przekazujemy odpowiedni obiekt.

    Zamiast typu klasy możemy także podać nazwę interfaceu który musi rozszerzać klasa aby można było ją przekazać.

    Innym typem który możemy zastosować jest array co skutkuje takim samym działaniem lecz przekazywany parametr musi być tablicą. No i w zasadzie na tym się kończą nasze możliwości

    Po nowemu

    W PHP7 mamy możliwość ustawienia typów prostych takich jak: int, float, bool, string. Działanie jest analogiczne:

    class Strategy {
        public function setValue(int $strategy)
        {
            # code...
        }
    }
    
    (new Strategy)->setStrategy(232);

    W tym wypadku przekazanie innego typu parametru będzie skutkowało błędem.

    Return Hint

    Tutaj sprawa ma się z goła bardzo podobnie do Type Hint. Return Hint daje nam możliwość określenia jaki dokładnie typ będzie zwracany przez funkcje:

    class Strategy {
        public function setValue(int $strategy): int
        {
            return $strategy
        }
    }
    
    $value = (new Strategy)->setStrategy(232);

    Jak widać na przykładzie Return Hint deklarujemy po parametrach funkcji : int

    Tutaj również mamy możliwość użycia typów prostych takich samych jak w przypadku Type Hint.

    Declare Strict

    W przypadku stosowania zamiennie int oraz float jako type hint nastąpi konwersja (stratna jeśli parametr wymaga int a przekazujemy float). Może to być bardzo kłopotliwe jeśli nie mamy testów jednostkowych bo taki bug ciężko wyłapać jeśli się nie zna zasady działania Type Hint.

    Aby temu zapobiec należy dodać zaraz po <?php odpowiednie declare:

    <?php
    declare(strict_types=1);

    Po takim zabiegu PHP ściśle będzie przestrzegał zasad przekazywania parametrów i w przypadku niezgodności typów wywali błąd.

    Podsumowanie

    Return Hint oraz Type Hint bardzo przydają tam się gdzie chcemy dbać o typy danych przekazywanych do metod lub typy zwracane przez metody. Dzięki temu nie musimy więcej sprawdzać jakiego typu jest zwrócona wartość z metody (a nie jak do tej pory tylko na podstawie PHPDoc) oraz nie musimy sprawdzać oczekiwanych wartości pod kątem typu przekazywanych do funkcji a jedynie samą wartość.

    Według mnie ta opcja powinna się znaleźć już w PHP5. Teraz czekamy na kolejne smaczki.

    Inne artykuły

    Top