Typy parametrów i wartości domyślne

🎯 Po tej lekcji będziesz pisać funkcje z pełną deklaracją typów i wartościami domyślnymi parametrów.

W poprzedniej lekcji poznałeś podstawy funkcji. Teraz zrobimy je bardziej niezawodnymi: dodamy deklaracje typów i wartości domyślne. Dzięki temu PHP będzie wyłapywać błędy już przy wywołaniu funkcji — zanim zdążą ukryć się głębiej w programie.

Typy parametrów

Przy każdym parametrze możesz — i powinieneś — podać jego typ. PHP sprawdzi, czy przekazujesz właściwy typ i zgłosi błąd, gdy coś się nie zgadza:

<?php
declare(strict_types=1);

function podwoj(int $n): int
{
    return $n * 2;
}

echo podwoj(5);    // wynik: 10
echo podwoj('5');  // TypeError — oczekiwano int, dostał string

Deklaracja typów działa jako dokumentacja i strażnik zarazem. Osoba czytająca kod od razu wie, co funkcja przyjmuje i co zwraca.

Typ zwracany

Typ wartości zwracanej przez funkcję deklarujesz po nawiasie zamykającym parametry, poprzedzając go dwukropkiem:

<?php
declare(strict_types=1);

function powitanie(string $imie): string
{
    return 'Cześć, ' . $imie . '!';
}

$tekst = powitanie('Ola');
echo $tekst; // wynik: Cześć, Ola!

Dostępne typy zwracane to m.in. string, int, float, bool, void (brak wartości), array oraz null (w formie ?string lub string|null).

Wartości domyślne parametrów

Parametr może mieć wartość domyślną — używaną, gdy wywołujący nie poda argumentu:

<?php
declare(strict_types=1);

function powitanie(string $imie, string $pora = 'dzień'): string
{
    return 'Dobry ' . $pora . ', ' . $imie . '!';
}

echo powitanie('Ola');              // wynik: Dobry dzień, Ola!
echo powitanie('Kuba', 'wieczór'); // wynik: Dobry wieczór, Kuba!
echo powitanie('Anna', 'ranek');   // wynik: Dobry ranek, Anna!

Wywołanie powitanie('Ola') nie podaje drugiego argumentu — PHP podstawia wtedy wartość domyślną 'dzień'.

💡 Kolejność ma znaczenie: Parametry z wartościami domyślnymi muszą stać za parametrami wymaganymi. Poniższy zapis:
function foo(string $a = 'x', int $b): void
w PHP 8.1+ zgłasza ostrzeżenie deprecacji (nie błąd składni) — kod się uruchomi, ale $a faktycznie stanie się parametrem wymaganym, a jego wartość domyślna przestaje mieć sens. Dlatego dobry nawyk to: zawsze umieszczaj parametry z wartościami domyślnymi na końcu listy.

Funkcja z kilkoma wartościami domyślnymi

Możesz mieć kilka parametrów z wartościami domyślnymi — wywołujący pomija tyle argumentów, ile chce (od końca listy):

<?php
declare(strict_types=1);

function opisZamowienia(
    string $produkt,
    int    $sztuki = 1,
    string $status = 'oczekuje'
): string {
    return $produkt . ' (' . $sztuki . ' szt.) — ' . $status;
}

echo opisZamowienia('Kawa');             // wynik: Kawa (1 szt.) — oczekuje
echo opisZamowienia('Herbata', 3);       // wynik: Herbata (3 szt.) — oczekuje
echo opisZamowienia('Cukier', 2, 'wysłane'); // wynik: Cukier (2 szt.) — wysłane

Nullable — wartość lub null

Gdy parametr może być null, dodaj ? przed typem:

<?php
declare(strict_types=1);

function przywitaj(?string $imie): string
{
    if ($imie === null) {
        return 'Cześć, nieznajomy!';
    }
    return 'Cześć, ' . $imie . '!';
}

echo przywitaj('Kuba'); // wynik: Cześć, Kuba!
echo przywitaj(null);   // wynik: Cześć, nieznajomy!

?string oznacza „string albo null" — parametr jest opcjonalny w tym sensie, że można przekazać null.

⚠️ Uwaga: ?string $imie = null to dwie różne rzeczy naraz: typ nullable (?string) i wartość domyślna (= null). Możesz je łączyć, ale pamiętaj — wartość domyślna sprawia, że argument możesz w ogóle pominąć; nullable oznacza, że możesz jawnie przekazać null.

W następnej lekcji poznasz named arguments — sposób na wywoływanie funkcji bez zapamiętywania kolejności parametrów.

Sprawdź się

Gdzie w definicji funkcji umieszczamy parametry z wartościami domyślnymi?

Co zwróci funkcja z typem zwracanym string, gdy użyjemy return bez wartości?

Jak zapis : string po liście parametrów funkcji wpływa na jej działanie?

Czy można wywołać powitanie('Ola'), gdy drugi parametr ma wartość domyślną?

Ćwiczenie

Napisz funkcję formatujCene(float $kwota, string $waluta = 'PLN'): string, która zwraca kwotę z walutą, np. '19.99 PLN'. Wywołaj ją raz bez podania waluty i raz z walutą 'EUR'. Wyświetl oba wyniki.

Pokaż rozwiązanie
<?php
declare(strict_types=1);

function formatujCene(float $kwota, string $waluta = 'PLN'): string
{
    return $kwota . ' ' . $waluta;
}

echo formatujCene(19.99);        // wynik: 19.99 PLN
echo formatujCene(9.99, 'EUR');  // wynik: 9.99 EUR