PHPDevs

Projekt obiektowy z Composerem i Twigiem? Czytaj!

Funkcje > Lekcja 4

Zwracanie danych

Czy każda funkcja musi coś wyświetlać albo wykonywać ostateczne operacje na danych? Oczywiście, że nie - byłoby to bardzo ograniczające. Możemy zwrócić dane z funkcji przy użyciu instrukcji return. Dane mogą być dowolnego typu, nawet array.

<?php
function getHello()
{
    return 'Hello world';
}
echo getHello(); // result: Hello world

Wartym zaznaczenia jest, że wywołanie return przerywa wykonywanie funkcji w tym momencie i zwraca wartość. Jeśli za return będzie dalszy kod, nie zostanie on wykonany.

<?php
function getHello()
{
    return 'Hello';
    echo 'world';
}
echo getHello(); // result: Hello

Zwracaną wartość możemy potraktować tak jak każdą inną - wyświetlić, podstawić od razu do warunku i tak dalej.

<?php
function getNumber()
{
    return 5;
}

echo getNumber(); // result 5

$number = getNumber();
echo $number; // result 5

if (getNumber() >= 2) {
    echo 'OK'; // result: OK
}

Typ zwracanej wartości

Również przy zwracaniu wartości mamy podobną możliwość określenia typu, jak przy przekazywaniu argumentów, która dostępna jest dla php >=7. Robimy to poprzez dodanie za nazwą i argumentami funkcji (ale przed określeniem ciała) znaku : oraz typu. Spójrz na przykład:

<?php
function getHello(): string
{
    return 'Hello world';
}
echo getHello(); // result: Hello world

Działa to na takiej samej zasadzie jak przy argumentach - domyślnie to co będzie możliwe zostanie rzutowane na odpowiedni typ. Aby wymusić dokładny typ musimy użyć strict_types. W przypadku próby zwrócenia wartości niepasującej do typu, wygenerowany zostanie błąd.

<?php
function getNumber(): int
{
    return 5.4;
}
echo getNumber(); // result: 5
<?php
declare(strict_types=1);
function getNumber(): int
{
    return 5.4;
}
echo getNumber(); // result: Uncaught TypeError: Return value of getNumber() must be of the type integer, float returned

Od php >=7.1 do dyspozycji jest również specjalny typ void, który oznacza tyle, że funkcja nie zwraca nic. Podobnie jak przy argumentach, nie jest możliwe określenie wielu typów zwracanych dla jednej funkcji. Jeśli musisz cos takiego zrobić, nie deklaruj typu i ewentualnie możesz użyć komentarza phpDoc z @return.

Pora wrócić do kalkulatora i zastosować w nim nową wiedzę. Przenieśmy wyświetlanie wyniku do osobnej funkcji i użyjmy zwracania wartości z określeniem typu. Całość będzie wyglądała tak:

<?php

$operation = '+';
$number1 = 8;
$number2 = 4;

function operationAddition(float $number1, float $number2): float
{
    return $number1 + $number2;
}

function operationSubtraction(float $number1, float $number2): float
{
    return $number1 - $number2;
}

function operationMultiplication(float $number1, float $number2): float
{
    return $number1 * $number2;
}

function operationDivision(float $number1, float $number2): float
{
    return $number1 / $number2;
}

function showResult(float $result)
{
    echo 'Result: ' . $result;
}

switch ($operation) {
    case '+':
        $result = operationAddition($number1, $number2);
        break;
    case '-':
        $result = operationSubtraction($number1, $number2);
        break;
    case '*':
        $result = operationMultiplication($number1, $number2);
        break;
    case '/':
        $result = operationDivision($number1, $number2);
        break;
}

showResult($result);

Na tym go zakończymy - może nie powstał najbardziej rozbudowany kalkulator świata, ale mam nadzieję, że było łatwiej zrozumieć pewne zagadnienia.

Ćwiczenia

  1. Stwórz funkcję isAdult zwracającą true, gdy osoba o wieku przesłanym przez argument jest dorosła lub false jeśli nie.

    Przykładowe rozwiązanie

  2. Przygotuj funkcję rectangleArea obliczającą pole prostokąta o bokach $sideA i $sideB, przekazanych przez argumenty. Zwróć obliczone pole z funkcji i wyświetl. Nadaj odpowiednie typy dla argumentów oraz zwracanej wartości, zakładając, że będziemy operowali tylko na liczbach całkowitych.
    <?php
    $sideA = 8;
    $sideB = 5;
    // your code here
    

    Przykładowe rozwiązanie

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze