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; }

funkcja.phpphp
<?php
function obliczWartosc(int $cena, int $ilosc = 1): int
{
    $suma = $cena * $ilosc;
    return $suma;
}
echo obliczWartosc(1299, 2) . PHP_EOL;
echo obliczWartosc(1299);
Wynik
2598
1299
  1. function rozpoczyna definicję, obliczWartosc jest naszą nazwą, a nawiasy zawierają parametry. int przed parametrem określa oczekiwany typ, : int typ wyniku.
  2. 1299 i 2 w wywołaniu to argumenty; trafiają kolejno do cena i ilosc. Lokalna suma wynosi 2598.
  3. return oddaje 2598 do miejsca wywołania, dopiero echo wypisuje ten wynik. Samo echo wewnątrz funkcji nie zastępowałoby zwracania wyniku.
  4. 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";

pliki-funkcji.phpphp
<?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');
Wynik
Cześć, Ala
  1. __DIR__ wskazuje katalog pliku, w którym zapisano tę instrukcję. Kropka skleja z nim fragment ścieżki.
  2. require przerywa wykonanie, jeśli nie da się dołączyć potrzebnego pliku. require_once nie wczyta go ponownie w tym samym żądaniu.
  3. include także dołącza plik, lecz przy niepowodzeniu zgłasza ostrzeżenie i zwykle pozwala kontynuować. Do wymaganych funkcji/konfiguracji wybieramy require_once.
  4. 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

rabat.phpphp
<?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);
Wynik
1700
  1. 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.
  2. 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.
  3. Dla 2000 i 15 licznik to 2000·85+50 = 170050. intdiv dzieli całkowicie przez 100, dając 1700 groszy.
  4. 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.

Ta interakcja wymaga włączonego JavaScriptu.

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

public/podstawy/06-funkcje.phpphp
<?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ć.

Oczekiwany rezultat
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ć

  1. Zapiszesz funkcję z parametrami, typem wyniku i walidacją zakresu.
  2. Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
  3. 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ę →
Źródła i dalsza nauka