Funkcja zbiera powtarzalny fragment kodu pod jedną nazwą. W PHP 8 można do niej dodać typy parametrów i wyniku, wartości domyślne oraz argumenty nazwane — dzięki temu kod jest czytelniejszy, a błędy wychodzą na jaw od razu. Na lekcji uczniowie piszą trzy funkcje i sprawdzają, co daje włączenie trybu ścisłego typów.
Scenariusz jest przeznaczony na 45 minut dla klasy znającej warunki, pętle i tablice w PHP — na przykład po lekcji o tablicach.
Przygotowanie stanowisk
Potrzebny jest PHP 8.x uruchamiany w terminalu (na przykład z pakietu XAMPP; sprawdź polecenie php -v). Rozpakuj pakiet z sekcji materiałów do osobnego folderu i przejdź do niego w terminalu. Skrypty uruchamiasz poleceniem php start.php; serwer WWW nie jest potrzebny, a wynik pojawia się w terminalu. Jeśli pobierasz pojedyncze pliki .php.txt ze strony zamiast ZIP, usuń końcówkę .txt lokalnie.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- zdefiniować funkcję z typowanymi parametrami i typem wyniku;
- ustawić wartość domyślną parametru i wywołać funkcję argumentami nazwanymi;
- wyjaśnić działanie
declare(strict_types=1)i obsłużyćTypeError; - przetestować funkcję na przypadkach brzegowych.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: ten sam wzór w kilku miejscach |
| 5–15 min | function, parametry, return, typy |
| 15–22 min | Wartości domyślne, argumenty nazwane, strict_types |
| 22–37 min | Trzy zadania samodzielne |
| 37–42 min | Przypadki brzegowe |
| 42–45 min | Pytania kontrolne |
Definicja i typy
function powitaj(string $imie): string
{
return "Czesc, $imie!";
}
string $imie to parametr z typem, a : string po nawiasie — typ zwracanej wartości. Instrukcja return kończy funkcję i oddaje wynik; typ void oznacza brak wyniku. Parametr może mieć wartość domyślną (string $zwrot = "Czesc") i wtedy można go pominąć. W PHP 8 argumenty można podawać z nazwami w dowolnej kolejności: powitaj(zwrot: "Hej", imie: "Ewa").
Domyślnie PHP próbuje w razie potrzeby zamieniać typy (np. tekst "7" na liczbę 7). Dyrektywa declare(strict_types=1); na początku pliku wyłącza to zachowanie: przekazanie tekstu tam, gdzie oczekiwano int, zgłasza TypeError, który można przechwycić blokiem try ... catch. Funkcje zdefiniowane w pliku są dostępne w całym pliku, także przed definicją.
Zadania
Zadanie 1. Kwadrat. Napisz kwadrat(int $n): int i sprawdź 7, −3 i 0.
Zadanie 2. Średnia. Napisz srednia(array $lista): float zwracającą średnią z dwoma miejscami; dla pustej tablicy ma zwrócić 0.0. Sprawdź [7, 9, 4, 10] i [].
Zadanie 3. Powitanie. Napisz powitaj(string $imie, string $zwrot = "Czesc"): string. Wywołaj ją trzy razy: z jednym argumentem, z dwoma i z argumentami nazwanymi w odwrotnej kolejności. Włącz strict_types i przechwyć TypeError przy wywołaniu kwadrat("7").
Dla chętnych: napisz ileParzystych(array $lista): int z użyciem array_filter i sprawdź ją dla [1, 2, 3, 4, 6] oraz tablicy pustej.
Rozwiązanie i wyniki
<?php
declare(strict_types=1);
function kwadrat(int $n): int
{
return $n * $n;
}
function srednia(array $lista): float
{
if (count($lista) === 0) {
return 0.0;
}
return round(array_sum($lista) / count($lista), 2);
}
function powitaj(string $imie, string $zwrot = "Czesc"): string
{
return "$zwrot, $imie!";
}
// Zadanie 1
echo kwadrat(7), " ", kwadrat(-3), " ", kwadrat(0), "\n";
// Zadanie 2
echo srednia([7, 9, 4, 10]), " ", srednia([]), "\n";
// Zadanie 3
echo powitaj("Ola"), "\n";
echo powitaj("Ola", "Witaj"), "\n";
echo powitaj(zwrot: "Hej", imie: "Ewa"), "\n";
try {
echo kwadrat("7");
} catch (TypeError $e) {
echo "TypeError: argument musi byc liczba calkowita\n";
}
Program wypisze:
49 9 0
7.5 0
Czesc, Ola!
Witaj, Ola!
Hej, Ewa!
TypeError: argument musi byc liczba calkowita
Bez strict_types PHP przekonwertowałby tekst "7" na liczbę i zwróciłby 49; w trybie ścisłym zgłasza TypeError. Zadanie dla chętnych (rozszerzenie.php) wypisuje:
3 0
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
| Fatal error: Uncaught TypeError | Przekazano argument niewłaściwego typu w trybie strict_types. |
| Funkcja nic nie wypisuje | Wynik zwrócono return, ale nie wypisano go instrukcją echo. |
| Fatal error: Cannot redeclare | Funkcja o tej nazwie jest już zdefiniowana. |
| ArgumentCountError | Za mało argumentów — parametr bez wartości domyślnej nie może być pominięty. |
declare(strict_types=1) nie działa | Dyrektywa musi być pierwszą instrukcją pliku (zaraz po <?php). |
| Wynik ma wiele cyfr po przecinku | Brakuje round(..., 2). |
Pytania kontrolne i punktacja
- Co oznacza
: intpo nawiasie w definicji funkcji? - Do czego służy
declare(strict_types=1)? - Jak wywołać funkcję z argumentami nazwanymi?
Odpowiedzi: Funkcja ma zwracać liczbę całkowitą. Wyłącza automatyczną zamianę typów argumentów — niewłaściwy typ zgłasza TypeError. funkcja(parametr: wartość), np. powitaj(zwrot: "Hej", imie: "Ewa").
Proponowana punktacja (razem 10 punktów): zadanie 1 — definicja z typami 2 pkt, trzy wyniki 1 pkt; zadanie 2 — średnia z zaokrągleniem 2 pkt, obsługa pustej tablicy 1 pkt; zadanie 3 — wartość domyślna 1 pkt, argumenty nazwane 1 pkt, strict_types i TypeError 1 pkt, wszystkie trzy wywołania 1 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to bezpieczne wypisywanie danych i obsługa formularzy z walidacją. Ten materiał rozwija dział o funkcjach w kursie PHP w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: funkcje w podręczniku PHP oraz deklaracje typów. Zobacz też lekcję o formularzach PHP.
Poprowadź kolejne lekcje PHP
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu PHP →