$name nie ma wartości domyślnej - jest wymagany. Bez niego wywołanie się nie uda.
$language ma wartość domyślną "pl" - jest opcjonalny. Można go pominąć przy wywołaniu.
Ważna kolejność: parametr z wartością domyślną musi stać na końcu listy, inaczej nie da się go pominąć.
Ciekawostka z PHP Manual: wartość domyślna musi być stałą wpisaną wprost w kodzie (liczbą, tekstem, tablicą), nie zmienną ani wynikiem wywołania innej funkcji - zapis w stylu function greetUser($name, $when = date("Y")) nie zadziała.
PHP Manual: „A function may define default values for parameters using syntax similar to assigning a variable. The default is used only when the parameter's argument is not passed” oraz „Note that any optional parameters should be specified after any required parameters, otherwise they cannot be omitted from calls” · php.net/manual/en/functions.arguments.php · ciekawostka: „The default value must be a constant expression, not (for example) a variable, a class member or a function call” · php.net/manual/en/functions.arguments.php
Wynik w przeglądarce:Cześć, Ala!, potem Hello, Ala! - pierwsze wywołanie użyło wartości domyślnej, drugie ją nadpisało.
Część 2 · Liczba argumentów a wynik
Tabela wywołań i wyników
PHP Manual: functions.arguments.php
Część 3 · Przekazanie przez wartość
Do funkcji trafia kopia, nie oryginał
Zmiana $word w środku funkcji nie rusza $text na zewnątrz - do środka trafiła tylko kopia wartości.
PHP Manual: „By default, function arguments are passed by value (so that if the value of the argument within the function is changed, it does not get changed outside of the function)” · php.net/manual/en/functions.arguments.php
Egzamin INF.03
Tak pytają na egzaminie
functioncalculate($a, $b) {
return ...
}
1. Która z wymienionych funkcji zapisanych językiem PHP zwraca sumę połowy a i połowy b?
function calculate($a, $b) { return $a/2 + $b; }
function calculate($a, $b) { return 2/$a + 2/$b; }
function calculate($a, $b) { return $a/2 + $b/2; }
function calculate($a, $b) { return ($a/2 + $b)/2; }
2. Która ze zdefiniowanych funkcji w języku PHP jako wynik zwraca połowę kwadratu wartości przekazanej?
function calculate($a) { echo $a/2; }
function calculate($a) { echo $a*$a/2; }
function calculate($a) { return $a/2; }
function calculate($a) { return $a*$a/2; }
CKE, E.14, czerwiec 2017, zadanie 33 · CKE, E.14, czerwiec 2015, zadanie 31
Ćwiczenie przy komputerze · 20 minut
Ćwiczenie: greetUser()
W swoim functions.php (z poprzedniej lekcji) dopisz funkcję greetUser($name, $language = "pl").
W ciele: gdy $language to "en", zwróć "Hello, $name!"; w przeciwnym razie zwróć "Cześć, $name!".
Wywołaj funkcję dwa razy: raz z jednym argumentem (greetUser("Ala")), raz z dwoma (greetUser("Ala", "en")). Każdy wynik osobną linią.
Sprawdź w przeglądarce pod localhost/functions.php, potem zostaw plik w folderze kursu.
Ma się pojawić:Cześć, Ala! i Hello, Ala!, jedna linia pod drugą, obok wyniku squareArea z poprzedniej lekcji. Zero komunikatów Warning albo Fatal error.
Dla szybkich: dodajcie w funkcji trzecią gałąź dla $language == "de" ("Hallo, $name!") i wywołajcie greetUser("Ala", "de").
Zasady pracowni
Na koniec
Sprawdź się
Co się dzieje, gdy pominiecie argument, który ma wartość domyślną?
Dlaczego parametr z wartością domyślną musi stać na końcu listy parametrów?
Jeśli zmienicie wartość parametru wewnątrz funkcji, czy zmieni się też zmienna, którą podaliście przy wywołaniu?
Następny temat: co widzi funkcja - zmienne lokalne.
Poza szkołą
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Argumenty podawane po kolei: greetUser("Ala", "en")
Argumenty nazwane (named arguments, PHP 8.0+): array_fill(start_index: 0, count: 100, value: 50) - kolejność przestaje mieć znaczenie, wartość domyślną można pominąć niezależnie od pozycji.
nadal w użyciu
Funkcja ma stałą liczbę parametrów ($name, $language)
Listy o zmiennej długości (...$numbers): funkcja przyjmuje dowolną liczbę argumentów jako jedną tablicę, np. function sum(...$numbers).
nadal w użyciu
Wartość domyślna "pl" wpisana wprost w kodzie funkcji
Domyślny język, waluta czy strefa czasowa trzymane w jednym pliku konfiguracyjnym projektu, nie rozproszone po sygnaturach funkcji.
nadal w użyciu
Named arguments i listy zmiennej długości: PHP Manual · php.net/manual/en/functions.arguments.php