PHP: funkcje własne i wbudowane, napisy, liczby, data i czas

INF.03 · teoria
autor: redakcja · 08.09.2026
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.

[ INF.03: PYTANIA Z TEGO DZIAŁU ]

Funk­cja to na­zwa­ny frag­ment kodu, który wy­wo­łu­je się po nazwie, do­sta­je ar­gu­men­ty w na­wia­sie i oddaje wynik. Część funk­cji pisze się samemu, a kil­ka­set go­to­wych daje sam PHP, więc dłu­go­ści napisu, za­okrą­gle­nia ceny ani dzi­siej­szej daty nie trzeba liczyć ręcz­nie. W części pi­sem­nej wra­ca­ją py­ta­nia o wynik krót­kie­go kodu z strlen, substr, strtoupper albo date, o to, która de­fi­ni­cja funk­cji na­praw­dę zwraca żądaną war­tość, oraz o funk­cję pa­su­ją­cą do opisu dzia­ła­nia. Lista „innych zadań prak­tycz­nych" w in­for­ma­to­rze CKE wy­mie­nia wprost ob­słu­gę dat i na­pi­sów oraz bi­blio­te­ki wbu­do­wa­ne, więc w za­da­niu prak­tycz­nym te funk­cje for­ma­tu­ją cenę i datę wy­pi­sy­wa­ną obok danych z bazy.

Funk­cja własna: pa­ra­me­try, war­tość do­myśl­na, return

De­fi­ni­cja funk­cji wła­snej za­czy­na się słowem function (FUNKCJA), po nim stoi nazwa, w na­wia­sie lista pa­ra­me­trów, a w klam­rach treść. Pa­ra­metr to zmien­na, która do­sta­je war­tość w chwili wy­wo­ła­nia. return (ZWRÓĆ) kończy dzia­ła­nie funk­cji i oddaje wynik w miej­sce wy­wo­ła­nia, więc war­tość da się przy­pi­sać do zmien­nej, wsta­wić do dzia­ła­nia albo wy­pi­sać. Funk­cja bez return oddaje null.
<?php function brutto($netto, $vat = 23) { return round($netto * (1 + $vat / 100), 2); } echo brutto(45) . " " . brutto(45, 8);
55.35 48.6
Drugi pa­ra­metr ma war­tość do­myśl­ną, do­pi­sa­ną po znaku rów­no­ści. Wy­wo­ła­nie brutto(45) pomija go, więc funk­cja liczy z 23 pro­cen­ta­mi, a brutto(45, 8) pod­sta­wia 8 i liczy stawkę ob­ni­żo­ną. Pa­ra­me­try z war­to­ścią do­myśl­ną muszą stać na końcu listy, bo ar­gu­men­ty przy­pi­su­ją się według ko­lej­no­ści. Nazwa funk­cji nie roz­róż­nia wiel­kich i małych liter, a dwie funk­cje o tej samej nazwie w jednym pliku kończą się błędem kry­tycz­nym.
W PHP 8 przed nazwą pa­ra­me­tru wolno po­sta­wić typ, a po na­wia­sie typ wyniku: function brutto(float $netto, int $vat = 23): float. De­kla­ra­cja pil­nu­je, żeby do funk­cji nie weszło coś zu­peł­nie innego, ale w ar­ku­szach i w banku pytań kod pisany jest bez typów, więc ich brak nie jest błędem. Osobny zapis to funk­cja strzał­ko­wa fn($x) => $x * 2, czyli jed­no­li­nij­ko­wa funk­cja bez nazwy, przy­dat­na jako ar­gu­ment dla array_map z lekcji o ta­bli­cach.

Zasięg zmien­nych: lo­kal­ne, global i static

Zasięg to obszar kodu, w którym zmien­na jest wi­docz­na. Zmien­na utwo­rzo­na w funk­cji jest lo­kal­na: ist­nie­je tylko do końca jej dzia­ła­nia i nie ma nic wspól­ne­go ze zmien­ną o tej samej nazwie spoza funk­cji. Zmien­na spoza funk­cji nie wcho­dzi do jej wnę­trza sama z siebie, i tym PHP różni się od przy­zwy­cza­jeń z innych ję­zy­ków.
<?php $licznik = 0; function dodaj() { $licznik = 5; } dodaj(); echo $licznik;
0
Widać to w prze­glą­dar­ce w in­ter­pre­te­rze PHP: po wej­ściu do funk­cji panel zmien­nych po­ka­zu­je jej własne zmien­ne, a nie te ze skryp­tu.
Do zmien­nej ze­wnętrz­nej sięga słowo global (GLOBALNA) po­sta­wio­ne w funk­cji przed jej nazwą, choć czy­tel­niej jest podać war­tość pa­ra­me­trem i ode­brać wynik przez return. Słowo static (STATYCZNA) robi co innego: zmien­na za­cho­wu­je war­tość między ko­lej­ny­mi wy­wo­ła­nia­mi tej samej funk­cji, więc static $n = 0; z in­struk­cją $n++ daje licz­nik wy­wo­łań, który po trze­cim wy­wo­ła­niu ma war­tość 3.
Ar­gu­ment jedzie do funk­cji jako kopia, więc zmiana pa­ra­me­tru w środku nie rusza zmien­nej z ze­wnątrz. Znak & przed nazwą pa­ra­me­tru, jak w function podwoj(&$x), prze­ka­zu­je zmien­ną przez re­fe­ren­cję, czyli funk­cja pra­cu­je na ory­gi­na­le i po jej wy­ko­na­niu zmien­na z ze­wnątrz ma nową war­tość. Tak samo działa sort z lekcji o ta­bli­cach: ta funk­cja prze­sta­wia ele­men­ty w samej zmien­nej.
Pu­łap­ka: echo w środku funk­cji wy­pi­su­je war­tość od razu, ale jej nie zwraca, więc zapisu $c = licz(5) nie da się użyć. Wynik oddaje wy­łącz­nie return.

Funk­cje na na­pi­sach

Funk­cja na­pi­so­wa to gotowa funk­cja PHP, która mierzy, wycina, za­mie­nia albo for­ma­tu­je ciąg znaków. Pierw­szym ar­gu­men­tem jest zwykle sam napis, a wy­ni­kiem nowy napis: ory­gi­nał zo­sta­je bez zmian, dopóki nie przy­pi­sze się wyniku z po­wro­tem do zmien­nej.
Funk­cja
Przy­kład
Wynik
strlen
strlen("kot")
3
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łu­go­ś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
trim
trim(" kot ")
kot
str_repeat
str_repeat("@", 5)
@@@@@
strrev
strrev("kot")
tok
strcmp
strcmp("abc", "abd")
liczba ujemna
nl2br
nl2br("a\nb")
a<br />\nb
htmlspecialchars
htmlspecialchars("<b>")
&lt;b&gt;
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 pol­skie znaki za­pi­sa­ne w UTF-8 psują ra­chu­nek: strlen("łódź") daje 7, bo ł, ó i ź zaj­mu­ją po dwa bajty. Litery liczy do­pie­ro mb_strlen z bi­blio­te­ki mbstring, ob­słu­gu­ją­cej znaki wie­lo­baj­to­we. Ten sam kłopot ma strtoupper, które zmie­nia wy­łącz­nie litery al­fa­be­tu ła­ciń­skie­go bez ogon­ków: wiel­kie Ł daje do­pie­ro mb_strtoupper.
substr (PODNAPIS) bierze trzy ar­gu­men­ty: napis, po­zy­cję startu li­czo­ną od zera oraz DŁUGOŚĆ wy­cin­ka, a nie po­zy­cję końca. Po­mi­nię­ta dłu­gość znaczy „do końca napisu", a ujemny start liczy się od tyłu. strpos (POZYCJA W NAPISIE) szuka frag­men­tu i oddaje jego po­zy­cję, też li­czo­ną od zera, a gdy frag­men­tu nie ma, zwraca false, więc spraw­dza się to po­rów­na­niem !== opi­sa­nym w lekcji o zmien­nych i ope­ra­to­rach. trim (PRZYTNIJ) usuwa białe znaki, czyli spacje, ta­bu­la­to­ry i znaki końca wier­sza, z po­cząt­ku i końca napisu, a wa­rian­ty ltrim i rtrim robią to tylko z jednej strony.
Trzy funk­cje pil­nu­ją wy­glą­du tekstu na stro­nie. nl2br za­mie­nia znaki nowego wier­sza na znacz­ni­ki ła­ma­nia, bo prze­glą­dar­ka sama ich nie widzi. htmlspecialchars za­mie­nia znaki spe­cjal­ne HTML na encje, przez co tekst od użyt­kow­ni­ka wy­świe­tla się jako tekst, a nie jako kod strony; wraca do tego lekcja o for­mu­la­rzach w PHP. number_format for­ma­tu­je liczbę: podaje się war­tość, liczbę miejsc po prze­cin­ku, se­pa­ra­tor dzie­sięt­ny i se­pa­ra­tor ty­się­cy.

Funk­cje na licz­bach

Funk­cja ma­te­ma­tycz­na to wbu­do­wa­na funk­cja li­czą­ca na licz­bach: za­okrą­gla, po­tę­gu­je albo losuje. Wszyst­kie pra­cu­ją na war­to­ściach zwra­ca­nych przez dzia­ła­nia aryt­me­tycz­ne z lekcji o ope­ra­to­rach.
Funk­cja
Przy­kład
Wynik
round
round(2.5)
3
round z miej­sca­mi
round(2.567, 2)
2.57
floor
floor(-1.5)
-2
ceil
ceil(2.1)
3
abs
abs(-4)
4
pow
pow(2, 10)
1024
sqrt
sqrt(81)
9
max
max(3, 9, 2)
9
min
min(3, 9, 2)
2
rand, mt_rand, random_int
rand(1, 6)
liczba cał­ko­wi­ta od 1 do 6
intdiv
intdiv(10, 4)
2
fmod
fmod(10.5, 3)
1.5
is_numeric
is_numeric("12.5")
true
round (ZAOKRĄGLIJ) za­okrą­gla ma­te­ma­tycz­nie, czyli po­łów­kę odsuwa od zera: round(2.5) daje 3, a round(-2.5) daje -3. Drugi ar­gu­ment mówi, ile miejsc po prze­cin­ku zo­sta­wić. 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 licz­bach do­dat­nich floor wy­glą­da jak ob­cię­cie części ułam­ko­wej i stąd bierze się po­mył­ka przy licz­bach ujem­nych.
Lo­so­wa­nie ma trzy funk­cje. rand i mt_rand biorą dolną i górną gra­ni­cę włącz­nie, przy czym w PHP 8 się­ga­ją do tego samego ge­ne­ra­to­ra. random_int losuje kryp­to­gra­ficz­nie, więc używa się jej tam, gdzie liczba pil­nu­je bez­pie­czeń­stwa, na przy­kład w kodzie jed­no­ra­zo­wym. Reszta z dzie­le­nia to ope­ra­tor % dla liczb cał­ko­wi­tych i fmod dla ułam­ko­wych, a sam iloraz cał­ko­wi­ty daje intdiv. is_numeric spraw­dza, czy napis da się po­trak­to­wać jak liczbę, więc przy­da­je się przy kon­tro­li tego, co przy­szło z for­mu­la­rza: is_numeric("12a") oddaje fałsz.

Data i czas

date (DATA) to funk­cja, która za­mie­nia znacz­nik czasu na napis zbu­do­wa­ny według wzoru po­da­ne­go w pierw­szym ar­gu­men­cie. Po­mi­nię­ty drugi ar­gu­ment znaczy „teraz". Litery wzoru są usta­lo­ne i to one wra­ca­ją w py­ta­niach.
Format date
Znaczy
Przy­kład
Y
rok czte­ro­cy­fro­wo
2026
y
rok dwu­cy­fro­wo
26
m
mie­siąc z zerem wio­dą­cym
09
n
mie­siąc bez zera
9
d
dzień z zerem wio­dą­cym
08
j
dzień bez zera
8
H
go­dzi­na w cyklu 24 z zerem wio­dą­cym
15
i
minuta
38
s
se­kun­da
20
D
skrót dnia ty­go­dnia
Tue
l
pełna nazwa dnia ty­go­dnia
Tuesday
N
numer dnia ty­go­dnia, po­nie­dzia­łek to 1
2
Znacz­nik czasu (timestamp) to liczba sekund od 1 stycz­nia 1970 roku i oddaje go time(). Znacz­nik dla kon­kret­nej daty składa mktime z ar­gu­men­ta­mi w ko­lej­no­ści go­dzi­na, minuta, se­kun­da, mie­siąc, dzień, rok. Datę za­pi­sa­ną sło­wa­mi ro­zu­mie strtotime, które przyj­mu­je za­rów­no 2026-09-08, jak i prze­su­nię­cie +7 days albo next monday. Po­praw­ność daty spraw­dza checkdate z ar­gu­men­ta­mi mie­siąc, dzień, rok: checkdate(2, 30, 2026) daje fałsz, bo lutego o trzy­dzie­stu dniach nie ma. Strefę cza­so­wą usta­wia date_default_timezone_set('Europe/Warsaw') na po­cząt­ku skryp­tu, ina­czej go­dzi­na może ro­zejść się z ze­ga­rem 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
Ra­chun­ki na datach robi się wła­śnie na znacz­ni­kach: róż­ni­ca dwóch znacz­ni­ków jest liczbą sekund, więc po­dzie­lo­na przez 86400 daje liczbę dni. Obiek­to­wa wersja tego samego to klasa DateTime z me­to­da­mi format i modify, wy­god­niej­sza przy do­da­wa­niu mie­się­cy i lat, ale w ar­ku­szach CKE i w banku pytań stoi zapis pro­ce­du­ral­ny z date i strtotime, więc ten trzeba znać na pamięć.

Przy­kła­dy z wy­ni­kiem

Sześć wy­wo­łań w takiej po­sta­ci, w jakiej po­ja­wia­ją się w py­ta­niach.
<?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
Dzie­le­nie 7 / 2 daje 3.5, a round za­okrą­gla po­łów­kę w górę, więc wy­ni­kiem jest 4. Cena pro­duk­tu ze sklepu prze­cho­dzi przez dwie funk­cje naraz: własna liczy war­tość brutto, a number_format robi z niej napis z gro­sza­mi.
<?php function brutto($netto, $vat = 23) { return $netto * (1 + $vat / 100); } $cena = brutto(1299); echo number_format($cena, 2, ",", " ") . " zl";
1 597,77 zl

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne o funk­cje mają kilka sta­łych kształ­tów. Pierw­szy to ramka z de­fi­ni­cją funk­cji i py­ta­nie, co ona zwraca: liczy się to, co stoi po return, więc de­fi­ni­cja z samym echo ni­cze­go nie zwraca, choć wy­pi­su­je wynik na stronę. Drugi to wy­wo­ła­nie z po­da­nym ar­gu­men­tem i py­ta­nie o wynik: pod­sta­wia się war­tość pod pa­ra­metr i prze­cho­dzi kod wiersz po wier­szu. Trzeci to funk­cja do­bra­na do opisu: ciąg n znaków @ daje str_repeat, usu­wa­nie bia­łych znaków z po­cząt­ku i końca to trim, a za­mia­na „ala ma psa" na „ALA MA PSA" to strtoupper, nie ucfirst, które zmie­nia samą pierw­szą literę. Czwar­ty to go­dzi­na w po­sta­ci 15:38:20, którą zwraca date("H:i:s"): time() nie przyj­mu­je wzoru, a we wzorze G:m:s litera m znaczy mie­siąc, nie minutę. Piąty to wynik substr podany jako cztery ka­wał­ki tego samego wyrazu. Szósty to spraw­dza­nie typu: is_int(135) daje prawdę, a is_int("135") fałsz, bo w cu­dzy­sło­wie stoi napis.
Pu­łap­ka: trzeci ar­gu­ment substr to DŁUGOŚĆ wy­cin­ka, a nie po­zy­cja ostat­nie­go znaku. substr("Zawodnik", 2, 4) daje wodn, a nie wod.
Dwie od­po­wie­dzi mylą się re­gu­lar­nie. strlen mierzy dłu­gość napisu, a count liczy ele­men­ty ta­bli­cy, więc pod­sta­wie­nie jednej za drugą jest błędem nawet wtedy, gdy kod się wykona. floor i round na licz­bie 2.7 dają różne wyniki, 2 oraz 3, bo pierw­sza zawsze scho­dzi w dół, a druga patrzy na część ułam­ko­wą.
W za­da­niu prak­tycz­nym te funk­cje pra­cu­ją przy wy­pi­sy­wa­niu danych. Cena po­bra­na z bazy idzie na stronę przez number_format($cena, 2, ",", " "), dzięki czemu ma dwa miej­sca po prze­cin­ku, prze­ci­nek dzie­sięt­ny i spację między ty­sią­ca­mi. W stopce strony rok wpi­su­je się jako date('Y'), żeby nie trzeba było go po­pra­wiać co sty­czeń. Tekst wpi­sa­ny przez użyt­kow­ni­ka wraca na stronę przez htmlspecialchars, a długie opisy skraca substr. Własną funk­cję pisze się wtedy, gdy ten sam ra­chu­nek po­wta­rza się w kilku miej­scach skryp­tu: jedna de­fi­ni­cja prze­li­cze­nia netto na brutto i trzy wy­wo­ła­nia niżej czy­ta­ją się lepiej niż trzy razy prze­pi­sa­ne mno­że­nie.

Ściąga

Zapis
Znaczy
function licz($a, $b = 2)
de­fi­ni­cja funk­cji, drugi pa­ra­metr ma war­tość do­myśl­ną
return $wynik;
kończy funk­cję i oddaje war­tość
global $x;
wpusz­cza do funk­cji zmien­ną z ze­wnątrz
static $n = 0;
zmien­na pa­mię­ta­ją­ca war­tość między wy­wo­ła­nia­mi
function podwoj(&$x)
pa­ra­metr przez re­fe­ren­cję, zmie­nia ory­gi­nał
strlen($s)
dłu­gość napisu w baj­tach
mb_strlen($s)
dłu­gość w zna­kach, także pol­skich
substr($s, 2, 4)
wy­ci­nek od po­zy­cji 2 o dłu­go­ści 4
strpos($s, "wod")
po­zy­cja frag­men­tu albo false
str_replace("a", "o", $s)
za­mia­na wszyst­kich wy­stą­pień
trim($s)
usuwa białe znaki z obu końców
str_repeat("@", 5)
po­wta­rza znak podaną liczbę razy
strtoupper($s)
całość wiel­ki­mi li­te­ra­mi
ucfirst($s)
pierw­sza litera wielka
number_format($c, 2, ",", " ")
1 234,50
round(2.5)
3, po­łów­ka idzie w górę
floor(-1.5), ceil(2.1)
-2 oraz 3
rand(1, 6)
losowa liczba cał­ko­wi­ta z za­kre­su
intdiv(10, 4), fmod(10.5, 3)
iloraz cał­ko­wi­ty 2, reszta 1.5
is_numeric($s)
czy napis jest liczbą
date("Y-m-d")
dzi­siej­sza data, na przy­kład 2026-09-08
date("H:i:s")
go­dzi­na, minuta i se­kun­da
time()
liczba sekund od 1 stycz­nia 1970
strtotime("+7 days")
znacz­nik czasu za ty­dzień
checkdate(2, 30, 2026)
czy data ist­nie­je, tu false
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.