Named arguments i argumenty wariadyczne

🎯 Po tej lekcji wywołasz funkcję z named arguments i napiszesz własną funkcję z wariadyczną listą parametrów.

W poprzedniej lekcji nauczyłeś się typów parametrów i wartości domyślnych. Teraz poznasz dwie funkcjonalności PHP 8, które czynią wywoływanie funkcji jeszcze wygodniejszym i czytelniejszym.

Named arguments — argumenty z nazwą

Normalnie argumenty przekazujesz w takiej kolejności, jak zdefiniowano parametry. Named arguments (PHP 8.0+) pozwalają podać nazwę parametru — i wtedy kolejność przestaje mieć znaczenie:

<?php
declare(strict_types=1);

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

// Normalne wywołanie — kolejność musi się zgadzać:
echo opisZamowienia('Kawa', 2, 'wysłane');
// wynik: Kawa — 2 szt. (wysłane)

// Named arguments — kolejność dowolna:
echo opisZamowienia(status: 'oczekuje', produkt: 'Herbata', sztuki: 5);
// wynik: Herbata — 5 szt. (oczekuje)

Składnia to nazwa: wartość — dwukropek, nie znak równości.

Named arguments i wartości domyślne

Named arguments świetnie sprawdzają się, gdy chcesz pominąć środkowy parametr z wartością domyślną i podać tylko ten na końcu:

<?php
declare(strict_types=1);

function raport(
    string $tytul,
    string $autor  = 'Anonimowy',
    int    $rok    = 2024,
    string $jezyk  = 'pl'
): string {
    return "[$jezyk] $tytul — $autor ($rok)";
}

// Chcemy zmienić tylko rok, resztę zostawiamy domyślną:
echo raport('PHP dla początkujących', rok: 2025);
// wynik: [pl] PHP dla początkujących — Anonimowy (2025)

// Możemy też zmienić kilka wybranych:
echo raport('Web Dev', autor: 'Kuba', jezyk: 'en');
// wynik: [en] Web Dev — Kuba (2024)

Bez named arguments musielibyśmy podać wszystkie parametry po kolei aż do tego, który chcemy zmienić.

💡 Czytelność: Named arguments są też świetne przy wywoływaniu funkcji wbudowanych z wieloma parametrami. Zamiast array_slice($tab, 0, 3, true) możesz napisać array_slice($tab, offset: 0, length: 3, preserve_keys: true) — od razu wiadomo co oznacza każda wartość.

Argumenty wariadyczne — dowolna liczba argumentów

Czasem nie wiesz z góry, ile argumentów ktoś poda. Operator ... przed nazwą parametru zbiera wszystkie przekazane argumenty w tablicę:

<?php
declare(strict_types=1);

function suma(int ...$liczby): int
{
    $wynik = 0;
    foreach ($liczby as $n) {
        $wynik += $n;
    }
    return $wynik;
}

echo suma(1, 2, 3);          // wynik: 6
echo suma(10, 20, 30, 40);   // wynik: 100
echo suma(7);                // wynik: 7

Parametr ...$liczby to wewnątrz funkcji zwykła tablica — możesz po niej iterować, liczyć elementy itd.

Łączenie parametrów i wariadycznych

Możesz mieć zwykłe parametry przed wariadycznym — wariadyczny musi być ostatni:

<?php
declare(strict_types=1);

function sumaZPrzedrostkiem(string $prefix, int ...$liczby): string
{
    $suma = array_sum($liczby);
    return $prefix . ': ' . $suma;
}

echo sumaZPrzedrostkiem('Suma', 1, 2, 3);     // wynik: Suma: 6
echo sumaZPrzedrostkiem('Razem', 10, 20);     // wynik: Razem: 30

Operator spread — rozpakowanie tablicy

Operator ... w wywołaniu funkcji działa odwrotnie: rozpakuje tablicę na osobne argumenty:

<?php
declare(strict_types=1);

function suma(int ...$liczby): int
{
    return array_sum($liczby);
}

$wartosci = [1, 2, 3, 4, 5];
echo suma(...$wartosci); // wynik: 15

Jest to szczególnie przydatne, gdy masz dane w tablicy i chcesz przekazać je do funkcji.

⚠️ Uwaga: Parametr wariadyczny może być tylko jeden na funkcję i musi stać na końcu listy parametrów. function foo(int ...$a, int ...$b) to błąd składni.

Sprawdź się

Jak wygląda składnia named argument w PHP?

Czym różni się ...$liczby w definicji funkcji od ...$tablica w wywołaniu?

Czy przy named arguments kolejność argumentów ma znaczenie?

Ćwiczenie

Napisz funkcję potega(int $podstawa, int $wykladnik = 2): int, która zwraca podstawa^wykladnik (użyj pętli lub operatora **). Wywołaj ją: raz z samą podstawą (domyślnie kwadrat), raz z named arguments podanymi w odwrotnej kolejności: potega(wykladnik: 3, podstawa: 2). Wyświetl wyniki.

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

function potega(int $podstawa, int $wykladnik = 2): int
{
    return (int) ($podstawa ** $wykladnik);
}

echo potega(5);                            // wynik: 25
echo potega(wykladnik: 3, podstawa: 2);    // wynik: 8