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.
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
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
Sytuacja
Co się dzieje
Poprawka
echo zamiast return w ciele funkcji
Wynik 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 expected
Podaj tyle argumentów, ile funkcja ma parametrów: squareArea(4)
Nazwa funkcji zaczyna się cyfrą, np. 2pole
Parse 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
2. Funkcja zapisana w języku PHP ma postać jak wyżej. Jej zadaniem jest
wypisanie liczby parzystej.
wypisanie liczby nieparzystej.
zwrócenie wartości 1, gdy liczba jest parzysta.
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
W folderze swojego serwera (np. htdocs) utwórz plik functions.php.
Napisz funkcję squareArea($side), która liczy pole kwadratu ($side * $side) i zwraca wynik przez return, nie przez echo.
Wywołaj ją dla trzech boków: 3, 5 i 10. Każdy wynik wypisz osobną linią, np. echo squareArea(3) . "<br>";.
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ę
Z jakich trzech części składa się definicja funkcji w PHP?
Co się dzieje z resztą kodu wewnątrz funkcji zaraz po wykonaniu return?
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 lekcji
W produkcji
Status
Jedna funkcja squareArea w tym samym pliku
Setki 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, camelCase
Ten 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ę.