← Lekcje
PHP · lekcja 08

Funkcje 1/3: parametry i return

Dzisiaj piszecie pierwszą własną funkcję:

  1. Funkcja jako „maszynka”: wejście (parametry), środek (ciało), wyjście (return)
  2. Ten sam kod przepisany 3 razy kontra 1 funkcja wywołana 3 razy
  3. Co dokładnie robi return? Skok do funkcji i powrót z wynikiem
  4. Ćwiczenie: functions.php z funkcją liczącą pole kwadratu
Rozgrzewka · 3 minuty

Rozgrzewka: foreach z poprzedniej lekcji

$grades = [4, 5, 3, 5];
foreach ($grades as $grade) {
    echo $grade . " ";
}
  1. Co wypisze ta pętla?
  2. Jak jedną linijką policzycie średnią z tablicy $grades?
  3. Czym różni się foreach ($grades as $grade) od foreach ($grades as $key => $grade)?
Część 1 · Po co funkcja

Bez funkcji: ten sam wzór 3 razy

$side1 = 3;
$area1 = $side1 * $side1;
echo $area1 . "<br>";   // 9

$side2 = 5;
$area2 = $side2 * $side2;
echo $area2 . "<br>";   // 25

$side3 = 10;
$area3 = $side3 * $side3;
echo $area3 . "<br>";  // 100

Ten sam wzór (bok * bok) przepisany trzy razy, tylko z inną liczbą. Gdy pomylicie się w jednym miejscu przy poprawce wzoru, musicie poprawić wszystkie trzy. To jest dokładnie problem, który rozwiązuje funkcja.

Część 2 · Definicja funkcji

Funkcja jako maszynka

$side = 5 wejście: parametr ciało funkcji $area = $side * $side; return $area; 25 wyjście: return
function squareArea($side) {
    $area = $side * $side;
    return $area;
}

Słowo kluczowe function, nazwa (squareArea, camelCase), lista parametrów w nawiasach (tu jeden: $side), ciało w klamrach. Nazwa funkcji: litera lub podkreślnik na początku, dalej litery, cyfry, podkreślniki.

Ciekawostka z PHP Manual: nazwy funkcji w PHP nie rozróżniają wielkości liter (dla liter A-Z). Zdefiniowaną squareArea() dałoby się wywołać nawet jako SQUAREAREA(), ale PHP Manual radzi wywoływać funkcję dokładnie tak, jak ją zdefiniowano.

PHP Manual: „A function is defined using the function keyword, a name, a list of parameters… followed by the body of the function enclosed in curly braces” · php.net/manual/en/functions.user-defined.php · ciekawostka: PHP Manual, „Function names are case-insensitive for the ASCII characters A to Z, though it is usually good form to call functions as they appear in their declaration.” · php.net/manual/en/functions.user-defined.php
Część 2 · Definicja raz, wywołanie wiele razy

Definicja raz, wywołanie wiele razy

function squareArea 1 definicja, napisana raz squareArea(3)→ 9 squareArea(5)→ 25 squareArea(10)→ 100
function squareArea($side) {
    return $side * $side;
}

echo squareArea(3) . "<br>";   // 9
echo squareArea(5) . "<br>";   // 25
echo squareArea(10) . "<br>";  // 100
PHP Manual: functions.user-defined.php
Część 3 · return

return: skok i powrót z wynikiem

main.php squareArea(5) $area = $side * $side; return $area; wraca z 25 program idzie dalej

Wywołanie squareArea(5) to skok w dół, do ciała funkcji. Po return program natychmiast wraca do miejsca wywołania, z wynikiem zamiast wywołania. Kod po return wewnątrz funkcji się nie wykonuje.

PHP Manual: „This causes the function to end its execution immediately and pass control back to the line from which it was called” · php.net/manual/en/functions.returning-values.php
Część 4 · Zanim zawołasz o pomoc

Trzy typowe błędy na start

SytuacjaCo się dziejePoprawka
echo zamiast return w ciele funkcjiWynik widać na ekranie, ale zmienna z wywołania to NULL (brak return = funkcja zwraca null)return $area;, a echo zostawcie na wywołanie: echo squareArea(4);
Wywołanie bez argumentu: squareArea()Fatal error: Uncaught ArgumentCountError: Too few arguments to function squareArea(), 0 passed… and exactly 1 expectedPodaj tyle argumentów, ile funkcja ma parametrów: squareArea(4)
Nazwa funkcji zaczyna się cyfrą, np. 2poleParse error: syntax error, unexpected integer "2"Nazwa zaczyna się literą lub podkreślnikiem: squareArea, nie 2pole
PHP Manual: „If the return is omitted the value null will be returned” · php.net/manual/en/functions.returning-values.php · PHP Manual: nazwa funkcji, „A valid function name starts with a letter or underscore” · php.net/manual/en/functions.user-defined.php
Egzamin INF.03

Tak pytają na egzaminie

function operations(int $x, float $y) {
    $z = $x + $y;
    return $z;
}

1. Przedstawiona funkcja zapisana w języku PHP

  1. zwraca wartość.
  2. nie zwraca wartości.
  3. pobiera dwa parametry z domyślną wartością.
  4. jest zdefiniowana z dwoma parametrami rzeczywistymi.
function fun1($number) {
    if($number % 2 == 0) return 1;
    return 0;
}

2. Funkcja zapisana w języku PHP ma postać jak wyżej. Jej zadaniem jest

  1. wypisanie liczby parzystej.
  2. wypisanie liczby nieparzystej.
  3. zwrócenie wartości 1, gdy liczba jest parzysta.
  4. zwrócenie wartości 0, gdy liczba jest parzysta.
CKE, EE.09, czerwiec 2022, zadanie 9 · CKE, E.14, wrzesień 2015, zadanie 31
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: functions.php

  1. W folderze swojego serwera (np. htdocs) utwórz plik functions.php.
  2. Napisz funkcję squareArea($side), która liczy pole kwadratu ($side * $side) i zwraca wynik przez return, nie przez echo.
  3. Wywołaj ją dla trzech boków: 3, 5 i 10. Każdy wynik wypisz osobną linią, np. echo squareArea(3) . "<br>";.
  4. Sprawdź wynik w przeglądarce pod localhost/functions.php.

Ma się pojawić: trzy liczby jedna pod drugą: 9, 25, 100. Zero komunikatów Warning albo Fatal error.

Dla szybkich: dopiszcie drugą funkcję squarePerimeter($side) (obwód: 4 * $side) i wywołajcie ją dla tych samych trzech boków.

Zasady pracowni
Na koniec

Sprawdź się

  1. Z jakich trzech części składa się definicja funkcji w PHP?
  2. Co się dzieje z resztą kodu wewnątrz funkcji zaraz po wykonaniu return?
  3. Czym różni się wypisanie wyniku przez echo wewnątrz funkcji od zwrócenia go przez return?

Następny temat: argumenty funkcji i wartości domyślne.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Jedna funkcja squareArea w tym samym plikuSetki funkcji w osobnych plikach, pogrupowane w klasy i katalogi (np. app/Helpers/); wczytywane automatycznie, bez ręcznego include. Temat plików i include omówimy na kolejnych lekcjach.nadal w użyciu
function squareArea($side) { … }Ten sam zapis funkcji, tylko z podpowiedzią typu: function squareArea(float $side): float { … }. Kod działa tak samo, edytor dodatkowo pilnuje, żeby nikt nie podał tekstu zamiast liczby.nadal w użyciu
Nazwa squareArea po angielsku, camelCaseTen sam standard w każdej firmie korzystającej z PHP (Laravel, Symfony): angielskie nazwy, camelCase dla zmiennych i funkcji, PascalCase dla klas.nadal w użyciu
Kopiowanie wzoru trzy razy (slajd „bez funkcji”)Narzędzia sprawdzające kod (linter) i przegląd kodu przez kolegę (code review) zgłaszają powtórzony fragment jako coś do wydzielenia w funkcję.nadal w użyciu
Podpowiedzi typów (type declarations): PHP Manual · php.net/manual/en/language.types.declarations.php