PHP tečaj: Funkcije

Funkcija je blok kode, ki lahko sprejme neke argumente, izvede neko zaporedje ukazov in lahko vrne neko vrednost. Kadar potrebujemo določeno funkcijo, jo lahko pokličemo iz ostalih delov naše programske kode.

Bloke kode v PHPju pišemo med pari zavitih oklepajev { in } — kodo znotraj blokov pa zaradi preglednosti s tabulatorjem zamaknemo desno.



Definicija funkcij

Napišimo funkcijo z imenom sestej, ki bo seštela dve števili in izpisala rezultat.

Definicijo funkcije vedno začnemo z besedico function, ki ji sledi ime funkcije. Nato med oklepajema ( in ) naštejemo morebitne argumente, ki so med seboj ločeni z vejicami. Na koncu zapišemo še eno- ali več-vrstični blok kode, ki predstavlja jedro funkcije.

function sestej($a, $b) {
   echo $a + $b;
}

Naša funkcija za seštevanje torej sprejme dva argumenta (spremenljivki) z imenoma a in b ter izpiše vsoto podanih vrednosti.

S tem, ko smo funkcijo definirali, je pripravljena za uporabo. Če želimo, da se programska koda v njej dejansko izvede, pa moramo funkcijo poklicati.



Klicanje funkcij

Funkcijo lahko pokličemo kjerkoli v naši PHP skripti — tudi pred samo definicijo funkcije, če smo funkcijo definirali šele na koncu datoteke.

Pri klicu navedemo ime funkcije, v oklepajih ( in ) naštejemo njene argumente ter na koncu napišemo še podpičje za zaključek ukaza. Oglejmo si primer za klicanje zgornje funkcije z imenom sestej:

sestej(5, 10);

Tako smo funkciji podali argumenta 5 in 10, ki ju znotraj funkcije predstavljata spremenljivki a in b.

PHP nam bo v jedru funkcije z ukazom echo izpisal njuno vsoto: 15

Omenimo še primer, kjer zgornji funkciji, ki sprejme dva argumenta, podamo samo enega:

sestej(80);

V tem primeru bo program še vedno deloval (izpiše se številka 80), ker bo PHP interpreter za drugi argument funkcije (spremenljivko b) predpostavil, da je njena vrednost 0. Bo pa v tem primeru PHP interpreter javil opozorilo Warning.

Temu se lahko izognemo tako, da pri definiciji funkcije argumentom navedemo tudi privzete vrednosti, ki se bodo uporabile, če teh argumentov pri klicu funkcije ne bomo podali.

Primer kode, v katerem obema argumentoma funkcije sestej določimo privzeto vrednost 0:

function sestej($a = 0, $b = 0) {
   echo $a + $b;
}

Sedaj lahko funkcijo pokličemo tudi samo z enim argumentom (ali pa celo brez podanih argumentov), pa kljub vsemu PHP interpreter ne bo javljal opozorila.

Kot argumente funkcije lahko seveda podamo tudi spremenljivke. Te spremenljivke imajo lahko celo enako ime kot znotraj funkcije, saj gre za dva različna nivoja spremenljivk — ene so veljavne samo zunaj funkcije, druge pa samo znotraj nje:

$a = 20;
$b = 30;
sestej($a, 5); // izpiše 25

V tem primeru pred klicem funkcije določena spremenljivka $b ne vpliva na spremenljivko z enakim imenom $b, ki se uporablja znotraj funkcije in smo ji ob klicu funkcije izrecno podali vrednost 5.

Če želimo znotraj funkcije dostopati do neke predhodno definirane spremenljivke (ki se nahaja izven funkcije) in to brez uporabe argumentov, lahko znotraj funkcije uporabimo ukaz global (brez katerega spodnja funkcija ne izpiše ničesar):

$vrednost = 99;

function testna_funkcija() {
   global $vrednost;
   echo $vrednost;
}

testna_funkcija();
Poskusite: V datoteko index.php med oznaki <?php in ?> skopirajte kodo iz zgornjega primera ter jo shranite. Nato program poženite v svojem brskalniku.

Se vam je na zaslonu izpisala številka 99?



Vračanje vrednosti z return

Namesto tega, da znotraj funkcije eksplicitno izpisujemo neko vrednost na zaslon, je pogosto bolje uporabiti ukaz return. Temu ukazu podamo neko vrednost, za katero želimo, da jo funkcija vrne tistemu delu kode, ki je funkcijo poklical. Sam ukaz return ničesar ne izpiše na zaslon, kot to stori npr. echo.

Na mestu, kjer znotraj funkcije uporabimo ukaz return, se izvajanje funkcije zaključi.

Primer, kako zgornjo funkcijo za seštevanje spremenimo v funkcijo, ki vrne rezultat:

function sestej($a, $b) {
   $vsota = $a + $b;
   return $vsota;
}

$rezultat_sestevanja = sestej(7, 4);

Če tako funkcijo pokličemo, se bodo ukazi v njej izvedli, izpisalo pa se ne bo nič. Seveda pri tem ne smemo pozabiti, da spremenljivka $vsota obstaja samo znotraj funkcije in da do te spremenljivke drugje v naši kodi ne moremo dostopati.

Ukaz return vrne vrednost spremenljivke $vsota na tisto mesto, od koder smo v naši kodi to funkcijo poklicali. V našem primeru se v spremenljivko $rezultat_sestevanja shrani vrednost 11.

Vrednost, ki jo funkcija vrne, lahko:

  • Shranimo v spremenljivko:
    $rezultat = sestej(29, 8);
    V spremenljivki z imenom rezultat imamo sedaj število 37.

  • Uporabimo kot argument neke druge funkcije:
    $vsota_treh_stevil = sestej(14, sestej(10, 5));
    V spremenljivki z imenom vsota_treh_stevil imamo sedaj število 29.

  • Z združevanjem . vključimo v nek niz. Potem lahko takšen niz npr. izpišemo:
    $x = 2;
    $y = 4;
    echo "Vsota števil {$x} in {$y} je " . sestej($x, $y);
    Izpis: Vsota števil 2 in 4 je 6



V PHP vgrajene funkcije

PHP vsebuje velik nabor funkcij — od takih za delo z nizi pa do takih za delo z bazami podatkov. Seznam vseh funkcij si lahko ogledate na naslovu https://www.php.net/funcref.

Brez skrbi! Če ste pogledali seznam vseh funkcij, vas je najbrž prestrašilo dejstvo, da je seznam izredno dolg in pokriva mnogo različnih področij, ki vam še niso domača.

Dobra novica: Od programerjev nihče ne pričakuje, da boste te funkcije poznali "na pamet". Dovolj je, da veste, da funkcije obstajajo — in da znate pogledati v dokumentacijo na https://www.php.net/, kako posamezno funkcijo uporabite takrat, ko jo potrebujete.

Do informacij o posamezni funkciji in njeni uporabi dostopamo tako, da njeno ime napišemo na konec spletnega naslova https://www.php.net/.

Dokumentacijo funkcije rand() si tako ogledamo na naslovu https://www.php.net/rand.

Na tej spletni strani vidimo sledeči opis funkcije: "Generate a random integer" — ta funkcija torej izbere naključno celo število. V nadaljnem opisu funkcije vidimo tudi naslednje besedilo, ki opisuje postopek klicanja funkcije:

int rand ( [int $min, int $max] )

  • int — Podatkovni tip, ki ga funkcija vrne (int = integer, celo število).
  • rand — Ime funkcije.
  • [, ] — Oglati oklepaji okrog posameznih argumentov pomenijo, da argumenti niso obvezni.
  • int $min — Prvi argument funkcije. int pomeni, da mora biti ta argument tipa integer, $min pa je notranje ime tega argumenta. Argumenti imajo običajno pomenljiva imena, da hitro ugotovimo, čemu so namenjeni. Z argumentom $min v funkciji rand() določimo najmanjše število, ki ga funkcija lahko vrne.
  • int $max — Drugi argument funkcije. S tem argumentom določimo največje število, ki ga funkcija rand() lahko vrne.
Če torej želimo izpisati neko naključno število med 1 in 6, to storimo s sledečim ukazom:

echo rand(1, 6);



Vgrajene funkcije za delo z nizi

Kot rečeno, so vse v PHP vgrajene funkcije podrobno opisane v dokumentaciji na naslovu https://www.php.net/.

Vendar pa boste v svoji programerski karieri določene funkcije uporabljali mnogo bolj pogosto kot kakšne druge. Zato si najprej poglejmo nekaj najbolj pogosto uporabljanih funkcij za delo z nizi:

  • echo(niz) — že znana funkcija za izpis niza, ki jo sicer lahko kličemo kot echo("Primer") ali pa echo "Primer" (brez oklepajev), kar je sicer izjema v programskem jeziku PHP in za ostale funkcije ne velja
  • strlen(niz) — vrne dolžino niza
    Primer: strlen("Janez") vrne 5
Pomembno: V večini programskih jezikov (vključno z jezikom PHP) velja, da kadar nekaj štejemo, začnemo šteti s številko 0 in ne 1, tako kot bi pričakovali. Za prvo črko v nizu torej rečemo, da je na poziciji 0. Sedma črka se nahaja na poziciji 6, in tako dalje.

  • substr(niz, zacetek [, dolzina ] ) — s to funkcijo iz niza vzamemo nek podniz, pri čemer štetje znakov za argument zacetek pričnemo s številko 0
    Primer izpisa prve črke: substr("Janez", 0, 1) vrne "J"
    Primer izpisa četrte in pete črke: substr("Janez", 3, 2) vrne "ez"
  • strpos(niz, podniz [, zacetek ]) — vrne prvi položaj nekega podniza v nizu, začenši na začetku niza ali pri podani vrednosti argumenta zacetek (če funkcija iskanega podniza ne najde, vrne false)
    Primer iskanja od začetka: strpos("Janez", "nez") vrne 2
    Primer iskanja od 3. črke dalje: strpos("Janez", "nez", 2) prav tako vrne 2
    Primer, ko iskani podniz ne obstaja: strpos("Janez", "d") vrne false
  • stripos(niz, podniz) — enaka funkcija kot strpos(), le da ni občutljiva na male in VELIKE črke
  • str_replace(najdi, zamenjaj_z, niz) — zamenja znake ali nize v nekem nizu
    Primer: str_replace("z", "ž", "Janez") vrne "Janež"
  • nl2br(niz) — znake za prelom vrstic1 iz neoblikovanega besedila pretvori v <br />
  • htmlspecialchars(niz) — morebitno HTML kodo v nizu pretvori v HTML entitete in s tem prepreči, da bi se pri izpisu uporabila morebitna HTML koda iz niza
    Primer: htmlspecialchars("<b>odebeljeno</b>") vrne "&lt;b&gt;odebeljeno&lt;b&gt;"
  • html_entity_decode(niz) — obratna funkcija od htmlspecialchars()
  • strip_tags(niz) — iz niza odstrani vso HTML kodo
    Primer: strip_tags("<i>ležeči</i> tekst") vrne "ležeči tekst"
  • urlencode(niz) — niz pretvori v obliko, primerno za pošiljanje preko URL naslova
    Primer: urlencode("Tečaj") vrne "Te%C4%8Daj"
  • urldecode(niz) — obratna funkcija od urlencode()
  • trim(niz) — odstrani morebitne presledke in znake \t, \n, \r, \0 in \x0B iz začetka in konca niza
    Primer: trim(" zapis ") vrne "zapis"
  • strtolower(niz), strtoupper(niz) — niz pretvorita v same male ali same VELIKE črke
  • md5(niz) — funkcija izračuna MD5 hash podanega niza, kar je uporabno npr. za kodiranje gesel
  • sha1(niz) — podobna kot md5(), le da izračuna SHA1 hash (varnejše)
  • mysql_real_escape_string(niz) — v nizu "escapa" vse potencialno nevarne znake, tako da lahko niz varno uporabimo za komuniciranje s strežnikom za podatkovno bazo, npr. v MySQL poizvedbi, kar bomo spoznali kasneje v tečaju


Vgrajene funkcije za delo s spremenljivkami

  • empty(spr) — vrne true, če je spremenljivka prazna, sicer pa false
    Prazne spremenljivke so: prazen niz "", število 0, false, NULL in prazno polje array().
  • isset(spr) — vrne true, če je spremenljivka definirana, sicer pa false
  • unset(spr [, spr2, ...]) — "izniči" podane spremenljivke
  • intval(spr) — spremenljivko (npr. niz) pretvori v celo število (kadar to ni mogoče, pa vrne vrednost 0)
  • doubleval(spr) — spremenljivko (npr. niz) pretvori v decimalno število (kadar to ni mogoče, pa vrne vrednost 0)
Funkciji intval(spr) in doubleval(spr) nam prideta prav pri izboljševanju varnosti svojih aplikacij. Če od uporabnika pričakujemo, da bo vnesel neka števila, potem ta števila "spustimo" skozi eno od teh dveh funkcij. Na ta način v vsakem primeru dobimo število, s katerim lahko potem naprej operiramo.



Vgrajene funkcije za delo z datumi in časom

  • time() — vrne trenutni timestamp, to je število sekund od 1. januarja 1970 ob 00:00:00 GMT2
    Primer: time() trenutno vrne 1715240234
  • microtime() — podobno kot time(), le da čas vrne v mikrosekundah
  • date(oblika [, timestamp ]) — vrne niz s trenutnim časom ali podanim timestamp časom, pri čemer izpis oblikujemo z argumentom oblika
    Primer: date("j. n. Y") v tem trenutku vrne "9. 5. 2024"
    Primer: date("Y-m-d H:i", 1627036925) vedno vrne "2021-07-23 12:42"
  • strtotime(niz) — poljuben zapis datuma z besedo v angleščini pretvori v timestamp
    Primer: strtotime("September 14, 2021") vedno vrne 1631570400
    Primer: strtotime("+1 week 2 days 9 hours 28 seconds") v tem trenutku vrne 1716050262
  • mktime([ura [, minuta [, sekunda [, mesec [, dan [, leto ]]]]]]) — iz podanih argumentov ustvari timestamp
    Primer: mktime(17, 42, 20, 5, 6, 2024) vedno vrne 1715010140
Primer sodelovanja dveh funkcij za delo s časom: Vzemimo timestamp 1715010140, ki nam ga je v zgornjem primeru vrnil klic funkcije mktime(). Ta timestamp lahko za drugi argument podamo funkciji date() in dobimo sledeči izpis:

echo date("H:i:s F j, Y", 1715010140);   // izpiše "17:42:20 May 6, 2024"



Druge najpogosteje uporabljane funkcije

  • define(ime, vrednost) — s to funkcijo ustvarimo konstanto, ki je kasneje ne moremo več spreminjati
    Primer: define("STEVILO", 35) — sedaj lahko to vrednost izpišemo takole: echo STEVILO (brez $)
  • exit([sporocilo]), die([sporocilo]) — ti dve funkciji prekineta izvajanje programa in izpišeta podano sporočilo
    Primer: exit("Napaka!")
  • header(niz) — pošlje informacijo brskalniku
    Primer: header("HTTP/1.0 404 Not Found") vrne napako 404 (datoteka ni bila najdena)
    Primer: header("Location: http://www.podjetje.si/kontakt.php") uporabnika preusmeri na http://www.podjetje.si/kontakt.php
  • sleep(cas) — začasno zaustavi delovanje programa za čas, podan v sekundah
  • usleep(cas) — začasno zaustavi delovanje programa za čas, podan v mikrosekundah
  • flush() — trenutni izpis eksplicitno pošlje uporabnikovemu brskalniku (običajno se sicer izpis uporabniku pošlje naenkrat in sicer po koncu izvajanja PHP skripte)


Ostale množice funkcij

Na naslednji seznam pa smo uvrstili sklope funkcij, ki jih boste v svoji programerski karieri slej ko prej potrebovali in posledično tudi srečali.

Seznam lahko preletite za boljši občutek o tem, kaj vse PHP omogoča že brez pretiranega dodatnega truda na vaši strani. Vsekakor pa vam na tem mestu še ni potrebno odpirati posameznih povezav in se izobraževati o sledečih funkcijah.

Spodnji seznam je zgolj informativen — vse potrebno bomo pokrili v okviru tečaja. :)


Poleg zgoraj naštetih funkcij PHP vključuje tudi širok nabor funkcij za delo z naslednjimi tehnologijami: PDF, PS, Flash (ming), RAR, ZIP, XML, SNMP, LDAP, OpenSSL in drugimi. Za nekatere od teh funkcij je potrebno namestiti dodatke (ang. extensions).

Še enkrat — brez skrbi! Zavedamo se, da je zgornji seznam vseh mogočih funkcij izredno dolg in pokriva mnogo različnih področij, ki vam še niso domača.

Dobra novica: Od programerjev nihče ne pričakuje, da boste te funkcije poznali "na pamet". Dovolj je, da veste, da funkcije obstajajo — in da znate pogledati v dokumentacijo na https://www.php.net/, kako posamezno funkcijo uporabite takrat, ko jo potrebujete.


V tem poglavju ste se spoznali s funkcijami in njihovo uporabo. Prav tako ste ugotovili, da PHP že vsebuje ogromno število funkcij, ki vam bodo v prihodnosti olajšale delo.

Čas je torej za naslednje poglavje, kjer se bomo spoznali s polji (ang. arrays)...



Prejšnje poglavje
Osnove PHP