Jak zdefiniować własną funkcję z parametrem domyślnym i instrukcją return oraz które funkcje wbudowane PHP wracają w pytaniach: strlen, substr, strtoupper, round, rand i date z formatami daty i czasu. Lekcja 12.5 kursu INF.03.
Funkcja to nazwany fragment kodu, który wywołuje się po nazwie, dostaje argumenty w nawiasie i oddaje wynik. Część funkcji pisze się samemu, a kilkaset gotowych daje sam PHP, więc długości napisu, zaokrąglenia ceny ani dzisiejszej daty nie trzeba liczyć ręcznie. W części pisemnej wracają pytania o wynik krótkiego kodu z strlen, substr, strtoupper albo date, o to, która definicja funkcji naprawdę zwraca żądaną wartość, oraz o funkcję pasującą do opisu działania. Lista „innych zadań praktycznych" w informatorze CKE wymienia wprost obsługę dat i napisów oraz biblioteki wbudowane, więc w zadaniu praktycznym te funkcje formatują cenę i datę wypisywaną obok danych z bazy.
Funkcja własna: parametry, wartość domyślna, return
Definicja funkcji własnej zaczyna się słowem function (FUNKCJA), po nim stoi nazwa, w nawiasie lista parametrów, a w klamrach treść. Parametr to zmienna, która dostaje wartość w chwili wywołania. return (ZWRÓĆ) kończy działanie funkcji i oddaje wynik w miejsce wywołania, więc wartość da się przypisać do zmiennej, wstawić do działania albo wypisać. Funkcja bez return oddaje null.
<?php
function brutto($netto, $vat = 23) {
return round($netto * (1 + $vat / 100), 2);
}
echo brutto(45) . " " . brutto(45, 8);
Drugi parametr ma wartość domyślną, dopisaną po znaku równości. Wywołanie brutto(45) pomija go, więc funkcja liczy z 23 procentami, a brutto(45, 8) podstawia 8 i liczy stawkę obniżoną. Parametry z wartością domyślną muszą stać na końcu listy, bo argumenty przypisują się według kolejności. Nazwa funkcji nie rozróżnia wielkich i małych liter, a dwie funkcje o tej samej nazwie w jednym pliku kończą się błędem krytycznym.
W PHP 8 przed nazwą parametru wolno postawić typ, a po nawiasie typ wyniku: function brutto(float $netto, int $vat = 23): float. Deklaracja pilnuje, żeby do funkcji nie weszło coś zupełnie innego, ale w arkuszach i w banku pytań kod pisany jest bez typów, więc ich brak nie jest błędem. Osobny zapis to funkcja strzałkowa fn($x) => $x * 2, czyli jednolinijkowa funkcja bez nazwy, przydatna jako argument dla array_map z lekcji o tablicach. Zasięg zmiennych: lokalne, global i static
Zasięg to obszar kodu, w którym zmienna jest widoczna. Zmienna utworzona w funkcji jest lokalna: istnieje tylko do końca jej działania i nie ma nic wspólnego ze zmienną o tej samej nazwie spoza funkcji. Zmienna spoza funkcji nie wchodzi do jej wnętrza sama z siebie, i tym PHP różni się od przyzwyczajeń z innych języków.
<?php
$licznik = 0;
function dodaj() {
$licznik = 5;
}
dodaj();
echo $licznik;
Widać to w przeglądarce w interpreterze PHP: po wejściu do funkcji panel zmiennych pokazuje jej własne zmienne, a nie te ze skryptu. Do zmiennej zewnętrznej sięga słowo global (GLOBALNA) postawione w funkcji przed jej nazwą, choć czytelniej jest podać wartość parametrem i odebrać wynik przez return. Słowo static (STATYCZNA) robi co innego: zmienna zachowuje wartość między kolejnymi wywołaniami tej samej funkcji, więc static $n = 0; z instrukcją $n++ daje licznik wywołań, który po trzecim wywołaniu ma wartość 3.
Argument jedzie do funkcji jako kopia, więc zmiana parametru w środku nie rusza zmiennej z zewnątrz. Znak & przed nazwą parametru, jak w function podwoj(&$x), przekazuje zmienną przez referencję, czyli funkcja pracuje na oryginale i po jej wykonaniu zmienna z zewnątrz ma nową wartość. Tak samo działa sort z lekcji o tablicach: ta funkcja przestawia elementy w samej zmiennej.
Pułapka: echo w środku funkcji wypisuje wartość od razu, ale jej nie zwraca, więc zapisu $c = licz(5) nie da się użyć. Wynik oddaje wyłącznie return.
Funkcje na napisach
Funkcja napisowa to gotowa funkcja PHP, która mierzy, wycina, zamienia albo formatuje ciąg znaków. Pierwszym argumentem jest zwykle sam napis, a wynikiem nowy napis: oryginał zostaje bez zmian, dopóki nie przypisze się wyniku z powrotem do zmiennej.
mb_strlen
mb_strlen("łódź")
4
strtoupper
strtoupper("php")
PHP
strtolower
strtolower("PHP")
php
ucfirst
ucfirst("ala ma psa")
Ala ma psa
ucwords
ucwords("ala ma psa")
Ala Ma Psa
substr
substr("Zawodnik", 0, 3)
Zaw
substr bez długości
substr("Zawodnik", 3)
odnik
substr od końca
substr("Zawodnik", -3)
nik
strpos
strpos("Zawodnik", "wod")
2
str_replace
str_replace("a", "o", "kawa")
kowo
str_repeat
str_repeat("@", 5)
@@@@@
strcmp
strcmp("abc", "abd")
liczba ujemna
nl2br
nl2br("a\nb")
a<br />\nb
htmlspecialchars
htmlspecialchars("<b>")
<b>
sprintf
sprintf("%.2f", 3.14159)
3.14
number_format
number_format(1234.5, 2, ",", " ")
1 234,50
strlen (DŁUGOŚĆ NAPISU) liczy bajty, a nie litery, więc polskie znaki zapisane w UTF-8 psują rachunek: strlen("łódź") daje 7, bo ł, ó i ź zajmują po dwa bajty. Litery liczy dopiero mb_strlen z biblioteki mbstring, obsługującej znaki wielobajtowe. Ten sam kłopot ma strtoupper, które zmienia wyłącznie litery alfabetu łacińskiego bez ogonków: wielkie Ł daje dopiero mb_strtoupper.
substr (PODNAPIS) bierze trzy argumenty: napis, pozycję startu liczoną od zera oraz DŁUGOŚĆ wycinka, a nie pozycję końca. Pominięta długość znaczy „do końca napisu", a ujemny start liczy się od tyłu. strpos (POZYCJA W NAPISIE) szuka fragmentu i oddaje jego pozycję, też liczoną od zera, a gdy fragmentu nie ma, zwraca false, więc sprawdza się to porównaniem !== opisanym w lekcji o zmiennych i operatorach. trim (PRZYTNIJ) usuwa białe znaki, czyli spacje, tabulatory i znaki końca wiersza, z początku i końca napisu, a warianty ltrim i rtrim robią to tylko z jednej strony. Trzy funkcje pilnują wyglądu tekstu na stronie. nl2br zamienia znaki nowego wiersza na znaczniki łamania, bo przeglądarka sama ich nie widzi. htmlspecialchars zamienia znaki specjalne HTML na encje, przez co tekst od użytkownika wyświetla się jako tekst, a nie jako kod strony; wraca do tego lekcja o formularzach w PHP. number_format formatuje liczbę: podaje się wartość, liczbę miejsc po przecinku, separator dziesiętny i separator tysięcy. Funkcje na liczbach
Funkcja matematyczna to wbudowana funkcja licząca na liczbach: zaokrągla, potęguje albo losuje. Wszystkie pracują na wartościach zwracanych przez działania arytmetyczne z lekcji o operatorach.
round z miejscami
round(2.567, 2)
2.57
rand, mt_rand, random_int
rand(1, 6)
liczba całkowita od 1 do 6
is_numeric
is_numeric("12.5")
true
round (ZAOKRĄGLIJ) zaokrągla matematycznie, czyli połówkę odsuwa od zera: round(2.5) daje 3, a round(-2.5) daje -3. Drugi argument mówi, ile miejsc po przecinku zostawić. floor (PODŁOGA) idzie zawsze w dół, więc floor(-1.5) to -2, a ceil (SUFIT) zawsze w górę, więc ceil(-1.5) to -1. Na liczbach dodatnich floor wygląda jak obcięcie części ułamkowej i stąd bierze się pomyłka przy liczbach ujemnych.
Losowanie ma trzy funkcje. rand i mt_rand biorą dolną i górną granicę włącznie, przy czym w PHP 8 sięgają do tego samego generatora. random_int losuje kryptograficznie, więc używa się jej tam, gdzie liczba pilnuje bezpieczeństwa, na przykład w kodzie jednorazowym. Reszta z dzielenia to operator % dla liczb całkowitych i fmod dla ułamkowych, a sam iloraz całkowity daje intdiv. is_numeric sprawdza, czy napis da się potraktować jak liczbę, więc przydaje się przy kontroli tego, co przyszło z formularza: is_numeric("12a") oddaje fałsz.
Data i czas
date (DATA) to funkcja, która zamienia znacznik czasu na napis zbudowany według wzoru podanego w pierwszym argumencie. Pominięty drugi argument znaczy „teraz". Litery wzoru są ustalone i to one wracają w pytaniach.
Format date
Znaczy
Przykład
Y
rok czterocyfrowo
2026
m
miesiąc z zerem wiodącym
09
d
dzień z zerem wiodącym
08
H
godzina w cyklu 24 z zerem wiodącym
15
D
skrót dnia tygodnia
Tue
l
pełna nazwa dnia tygodnia
Tuesday
N
numer dnia tygodnia, poniedziałek to 1
2
Znacznik czasu (timestamp) to liczba sekund od 1 stycznia 1970 roku i oddaje go time(). Znacznik dla konkretnej daty składa mktime z argumentami w kolejności godzina, minuta, sekunda, miesiąc, dzień, rok. Datę zapisaną słowami rozumie strtotime, które przyjmuje zarówno 2026-09-08, jak i przesunięcie +7 days albo next monday. Poprawność daty sprawdza checkdate z argumentami miesiąc, dzień, rok: checkdate(2, 30, 2026) daje fałsz, bo lutego o trzydziestu dniach nie ma. Strefę czasową ustawia date_default_timezone_set('Europe/Warsaw') na początku skryptu, inaczej godzina może rozejść się z zegarem w Polsce.
<?php
date_default_timezone_set('Europe/Warsaw');
$zlozone = mktime(0, 0, 0, 9, 8, 2026);
$wazne = strtotime('+14 days', $zlozone);
echo "Zamowienie z " . date('d.m.Y', $zlozone);
echo ", wazne do " . date('d.m.Y', $wazne);
Zamowienie z 08.09.2026, wazne do 22.09.2026
Rachunki na datach robi się właśnie na znacznikach: różnica dwóch znaczników jest liczbą sekund, więc podzielona przez 86400 daje liczbę dni. Obiektowa wersja tego samego to klasa DateTime z metodami format i modify, wygodniejsza przy dodawaniu miesięcy i lat, ale w arkuszach CKE i w banku pytań stoi zapis proceduralny z date i strtotime, więc ten trzeba znać na pamięć.
Przykłady z wynikiem
Sześć wywołań w takiej postaci, w jakiej pojawiają się w pytaniach.
<?php
echo substr("Zawodnik", 0, 3) . "|";
echo strlen("kot") . "|";
echo strtoupper("php") . "|";
echo date("d.m.Y", mktime(0, 0, 0, 9, 8, 2026)) . "|";
echo round(7 / 2) . "|";
echo str_replace("a", "o", "kawa");
Zaw|3|PHP|08.09.2026|4|kowo
Dzielenie 7 / 2 daje 3.5, a round zaokrągla połówkę w górę, więc wynikiem jest 4. Cena produktu ze sklepu przechodzi przez dwie funkcje naraz: własna liczy wartość brutto, a number_format robi z niej napis z groszami.
<?php
function brutto($netto, $vat = 23) {
return $netto * (1 + $vat / 100);
}
$cena = brutto(1299);
echo number_format($cena, 2, ",", " ") . " zl";
Na egzaminie
Pytania pisemne o funkcje mają kilka stałych kształtów. Pierwszy to ramka z definicją funkcji i pytanie, co ona zwraca: liczy się to, co stoi po return, więc definicja z samym echo niczego nie zwraca, choć wypisuje wynik na stronę. Drugi to wywołanie z podanym argumentem i pytanie o wynik: podstawia się wartość pod parametr i przechodzi kod wiersz po wierszu. Trzeci to funkcja dobrana do opisu: ciąg n znaków @ daje str_repeat, usuwanie białych znaków z początku i końca to trim, a zamiana „ala ma psa" na „ALA MA PSA" to strtoupper, nie ucfirst, które zmienia samą pierwszą literę. Czwarty to godzina w postaci 15:38:20, którą zwraca date("H:i:s"): time() nie przyjmuje wzoru, a we wzorze G:m:s litera m znaczy miesiąc, nie minutę. Piąty to wynik substr podany jako cztery kawałki tego samego wyrazu. Szósty to sprawdzanie typu: is_int(135) daje prawdę, a is_int("135") fałsz, bo w cudzysłowie stoi napis.
Pułapka: trzeci argument substr to DŁUGOŚĆ wycinka, a nie pozycja ostatniego znaku. substr("Zawodnik", 2, 4) daje wodn, a nie wod.
Dwie odpowiedzi mylą się regularnie. strlen mierzy długość napisu, a count liczy elementy tablicy, więc podstawienie jednej za drugą jest błędem nawet wtedy, gdy kod się wykona. floor i round na liczbie 2.7 dają różne wyniki, 2 oraz 3, bo pierwsza zawsze schodzi w dół, a druga patrzy na część ułamkową.
W zadaniu praktycznym te funkcje pracują przy wypisywaniu danych. Cena pobrana z bazy idzie na stronę przez number_format($cena, 2, ",", " "), dzięki czemu ma dwa miejsca po przecinku, przecinek dziesiętny i spację między tysiącami. W stopce strony rok wpisuje się jako date('Y'), żeby nie trzeba było go poprawiać co styczeń. Tekst wpisany przez użytkownika wraca na stronę przez htmlspecialchars, a długie opisy skraca substr. Własną funkcję pisze się wtedy, gdy ten sam rachunek powtarza się w kilku miejscach skryptu: jedna definicja przeliczenia netto na brutto i trzy wywołania niżej czytają się lepiej niż trzy razy przepisane mnożenie.
Ściąga
function licz($a, $b = 2)
definicja funkcji, drugi parametr ma wartość domyślną
return $wynik;
kończy funkcję i oddaje wartość
global $x;
wpuszcza do funkcji zmienną z zewnątrz
static $n = 0;
zmienna pamiętająca wartość między wywołaniami
function podwoj(&$x)
parametr przez referencję, zmienia oryginał
strlen($s)
długość napisu w bajtach
mb_strlen($s)
długość w znakach, także polskich
substr($s, 2, 4)
wycinek od pozycji 2 o długości 4
strpos($s, "wod")
pozycja fragmentu albo false
str_replace("a", "o", $s)
zamiana wszystkich wystąpień
trim($s)
usuwa białe znaki z obu końców
str_repeat("@", 5)
powtarza znak podaną liczbę razy
strtoupper($s)
całość wielkimi literami
ucfirst($s)
pierwsza litera wielka
number_format($c, 2, ",", " ")
1 234,50
round(2.5)
3, połówka idzie w górę
floor(-1.5), ceil(2.1)
-2 oraz 3
rand(1, 6)
losowa liczba całkowita z zakresu
intdiv(10, 4), fmod(10.5, 3)
iloraz całkowity 2, reszta 1.5
is_numeric($s)
czy napis jest liczbą
date("Y-m-d")
dzisiejsza data, na przykład 2026-09-08
date("H:i:s")
godzina, minuta i sekunda
time()
liczba sekund od 1 stycznia 1970
strtotime("+7 days")
znacznik czasu za tydzień
checkdate(2, 30, 2026)
czy data istnieje, tu false
Pobierz ściągę PDF