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ć.
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.
function foo(int ...$a, int ...$b) to błąd składni.Sprawdź się
Jak wygląda składnia named argument w PHP?
Named arguments zapisujemy jako nazwa: wartość, np. powitanie(imie: 'Ola'). Dwukropek, nie znak równości ani strzałka.
Czym różni się ...$liczby w definicji funkcji od ...$tablica w wywołaniu?
Operator ... ma dwa zastosowania: w definicji funkcji (variadic) zbiera wiele argumentów w jedną tablicę; w wywołaniu (spread) rozpakuje tablicę na osobne argumenty.
Czy przy named arguments kolejność argumentów ma znaczenie?
Nazwa identyfikuje parametr jednoznacznie — PHP wie, który argument do którego parametru przypisać, niezależnie od kolejności.
Ć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