INF.03 · Aplikacje internetowe PHP
Funkcje w PHP
Funkcja zwraca wynik do użycia dalej.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Zapiszesz funkcję z parametrami, typem wyniku i walidacją zakresu.
Zrozum mechanizm
Funkcja wydziela jedną nazwaną czynność. Parametry przyjmują argumenty, a return zwraca wynik i kończy to wywołanie. Echo tylko wypisuje — nie zastępuje return w funkcji obliczeniowej. Zmienne lokalne nie są automatycznie widoczne poza funkcją. Wartość domyślna parametru jest używana, gdy argument pominięto.
Typy parametrów i wyniku dokumentują kontrakt, lecz nie zastępują walidacji zakresu. declare(strict_types=1) w pliku wywołującym ogranicza automatyczne konwersje typów skalarnych. W funkcji rabatu kwoty są w groszach, a zaokrąglenie do najbliższego grosza jest świadomą regułą. Include dołącza plik, require wymaga jego istnienia, require_once chroni przed wielokrotnym wczytaniem definicji.
Jak uruchamiać krótkie przykłady?
Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.
Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.
Funkcja: definicja, argument i return
Policzenie wartości biletów będzie potrzebne w kilku miejscach. Nazwij czynność, przekaż jej dane i odbierz wynik.
Podstawowa forma: function nazwa($parametr) { return wynik; }
<?php
function obliczWartosc(int $cena, int $ilosc = 1): int
{
$suma = $cena * $ilosc;
return $suma;
}
echo obliczWartosc(1299, 2) . PHP_EOL;
echo obliczWartosc(1299);
2598 1299
- function rozpoczyna definicję, obliczWartosc jest naszą nazwą, a nawiasy zawierają parametry. int przed parametrem określa oczekiwany typ, : int typ wyniku.
- 1299 i 2 w wywołaniu to argumenty; trafiają kolejno do cena i ilosc. Lokalna suma wynosi 2598.
- return oddaje 2598 do miejsca wywołania, dopiero echo wypisuje ten wynik. Samo echo wewnątrz funkcji nie zastępowałoby zwracania wyniku.
- W drugim wywołaniu pomijamy ilość, więc działa wartość domyślna 1. Zmienna suma jest lokalna — nie odczytujemy jej poza funkcją.
require_once i __DIR__: skąd biorą się funkcje projektu?
W dalszych lekcjach zobaczysz h(), pole() i wymagajPost(). To nasze funkcje z paczki, a nie wbudowane polecenia PHP. Muszą zostać wczytane przed użyciem.
Podstawowa forma: require_once __DIR__ . "/plik.php";
<?php
// Schemat dwóch plików — nie wklejaj obu części do jednego pliku.
// funkcje.php:
function powitaj(string $imie): string
{
return 'Cześć, ' . $imie;
}
// start.php:
// require_once __DIR__ . '/funkcje.php';
echo powitaj('Ala');
Cześć, Ala
-
__DIR__wskazuje katalog pliku, w którym zapisano tę instrukcję. Kropka skleja z nim fragment ścieżki. - require przerywa wykonanie, jeśli nie da się dołączyć potrzebnego pliku. require_once nie wczyta go ponownie w tym samym żądaniu.
- include także dołącza plik, lecz przy niepowodzeniu zgłasza ostrzeżenie i zwykle pozwala kontynuować. Do wymaganych funkcji/konfiguracji wybieramy require_once.
- W paczce bootstrap.php wczytuje funkcje wspólne. W przykładzie instrukcja require jest komentarzem, bo funkcja do demonstracji jest zdefiniowana powyżej.
Wyjątek i obliczenie rabatu w funkcji z paczki
Pełna cenaPoRabacie ma więcej niż samo mnożenie. Sprawdza kontrakt danych i świadomie zaokrągla do grosza.
Podstawowa forma: throw new InvalidArgumentException(opis) zgłasza błąd, intdiv(a,b) daje całkowity iloraz
<?php
function cenaPoRabacie(int $grosze, int $procent = 0): int
{
if ($grosze < 0 || $procent < 0 || $procent > 100) {
throw new InvalidArgumentException('Nieprawidłowa cena lub rabat.');
}
return intdiv($grosze * (100 - $procent) + 50, 100);
}
echo cenaPoRabacie(2000, 15);
1700
- if odrzuca kwotę ujemną lub rabat spoza 0–100. throw kończy zwykły przebieg funkcji i zgłasza obiekt błędu do wywołującego.
- new tworzy obiekt wyjątku z komunikatem. Własną obsługę błędu możesz umieścić w try/catch; nie udawaj poprawnego wyniku po błędzie.
- Dla 2000 i 15 licznik to 2000·85+50 = 170050. intdiv dzieli całkowicie przez 100, dając 1700 groszy.
- Dodane 50 realizuje przy nieujemnych kwotach zaokrąglenie do najbliższego grosza. Typ int nie zastępuje reguły zakresu.
Sprawdź w działaniu
Funkcja zwraca wynik do użycia dalej — sprawdź w modelu
Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.
Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.
Uruchom krok po kroku
Uruchom cenaPoRabacie(2000,15). Oczekujesz 1700 groszy. Sprawdź rabat 0 i 100, następnie -1 oraz 101. Nie ukrywaj błędów danych przez przymusową zamianę wszystkiego na int. Wspólne funkcje h(), pole() i tokenFormularza() w dalszym projekcie realizują osobne, nazwane zadania.
Plik wzorcowy: public/podstawy/06-funkcje.php
<?php
declare(strict_types=1);
function cenaPoRabacie(int $grosze, int $procent = 0): int
{
if ($grosze < 0 || $procent < 0 || $procent > 100) {
throw new InvalidArgumentException('Nieprawidłowa cena lub rabat.');
}
return intdiv($grosze * (100 - $procent) + 50, 100);
}
echo cenaPoRabacie(2000, 15); // 1700 groszy, zaokrąglenie do najbliższego grosza
Pobierz i odtwórz projekt
W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.
Ćwiczenie z pomocą · samodzielna praca
Twoja próba — podpowiedzi otwieraj po kolei
Napisz kosztBiletow(int cenaGrosze,int liczba):int. Przyjmij cenę>=0 i liczbę 1–10; inne dane odrzuć.
1299 i 3→3897;0 i 1→0; liczba 0 i 11 odrzucone.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.
Krok 2 — pokaż podpowiedź
Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.
Krok 3 — pokaż podpowiedź
Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
Podsumowanie
Co warto zapamiętać
- Zapiszesz funkcję z parametrami, typem wyniku i walidacją zakresu.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- Nie oddajesz haseł, pliku config.local.php ani wartości cookie.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →