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ń'.
function foo(string $a = 'x', int $b): voidw 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.
?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?
Parametry z wartościami domyślnymi muszą stać za parametrami wymaganymi (bez wartości domyślnej). Inaczej PHP nie wiedziałby, które argumenty pominięto.
Co zwróci funkcja z typem zwracanym string, gdy użyjemy return bez wartości?
Z declare(strict_types=1) PHP zgłosi TypeError, bo null nie jest stringiem. Typ zwracany musi pasować do deklaracji.
Jak zapis : string po liście parametrów funkcji wpływa na jej działanie?
: string po nawiasie zamykającym parametry to deklaracja typu zwracanego. PHP sprawdzi przy strict_types=1, czy rzeczywiście zwracasz string.
Czy można wywołać powitanie('Ola'), gdy drugi parametr ma wartość domyślną?
Gdy parametr ma wartość domyślną, możesz go pominąć przy wywołaniu — PHP podstawi wartość domyślną automatycznie.
Ć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