Aktualizacja do najnowszego PHP 8 już jest! Zobacz główne zmiany.

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. Rzecz jasna, dane mogą być dowolnego typu.

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

Warte zaznaczenia jest, że wywołanie return przerywa wykonywanie funkcji w tym momencie i zwraca wartość. Jeśli za nim 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ć, przypisać, użyć od razu w 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

Co ciekawe, php 7.1 wprowadza do dyspozycji jest również specjalny typ void, który oznacza tyle, że funkcja nie zwraca nic. Podobnie jak przy argumentach, od php 8.0 jest możliwe określenie wielu typów zwracanych dla jednej funkcji. Jeśli musisz zrobić to we wcześniejszych wersjach, nie deklaruj typu i ewentualnie możesz użyć komentarza PHPDoc z @return.

<?php
function getNumber(): int|float
{
    return 5.4;
}
echo getNumber(); // result: 5.4

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