Spletni PHP krožek

2. teden

Ponovno lep pozdrav!

Spet smo nazaj! Upam, da ti 1. domači nalogi nista delali prevelikih težav. Rešitve si lahko ogledaš na forumu.

Ta teden se bomo posvetili funkcijam v PHPju - takim, ki jih bomo napisali sami in vgrajenim.

Kaj je funkcija?

Funkcija je blok kode, ki sprejme argumente in izvede neko zaporedje ukazov ali vrne nek rezultat.

Ni nujno, da funckiji podaš kakšen argument, pa tudi "rezultat" lahko vrne na več različnih načinov:

- lahko vrne vrednost z ukazom return
- lahko nekaj izpiše na zaslon z ukazom print
- lahko samo izvede neko zaporedje ukazov

V splošnem funkcije uporabljamo, kadar želimo neko opravilo večkrat ponoviti in ne želimo vsakič napisati celotne kode. Primer:

Imamo števila A, B in C. Želeli bi izračunati (((A+B)*C)-100)*B za več naborov števil A, B in C.

Tako bi zapisali funckijo, ki bi sprejela podatke (argumente) o številih A, B in C ter vrnila izračunano vrednost po zgornji formuli. V PHP kodi zadeva izgleda takole:

<?php
function izracunaj($a,$b,$c)
{
print ((($a+$b)*$c)-100)*$b;
}
?>

Sestavni deli funckije:

2. vrstica: definicija funkcije: function (1) ime funkcije (2) (argumenti, ločeni z vejicami) (3)

(1): rezervirana beseda function, s katero nakažemo začetek funkcije
(2): ime funkcije - tukaj si lahko sam izmisliš neko ime, pri poimenovanju pa veljajo podobna pravila kot pri imenih spremenljivk - ne uporabljaj presledkov, šumnikov ali samo števil
(3): argumenti so imena spremenljivk, s katerimi operiramo znotraj funkcije in jih določimo ob klicu funkcije. Veljajo samo znotraj bloka kode funkcije.

3. vrstica: začetek bloka kode funkcije označimo z zavitim oklepajem ({) (dobiš ga z Alt Gr + B)

4. vrstica: tukaj lahko (seveda tudi v večih vrsticah) napišemo kodo funckije.
Rezultat funkcije lahko po želji nato izpišemo z ukazom print ali pa vrednost samo vrnemo z ukazom return.

5. vrstica: konec bloka kode funkcije - zaviti zaklepaj (})

Krajša oblika zapisa funkcije bi bila:
function ime_funkcije(argumenti) {
    /* koda funkcije
    koda funkcije /*
}
Tako smo zaviti oklepaj premaknili v isto vrstico kot za definicijo funkcije.
Blok kode znotraj funkcije (med zavitimi oklepaji) običajno zamaknemo v desno z nekaj presledki ali enkratnim pritiskom na TAB.

Klicanje funkcije

Vrnimo se k našem primeru - če bi želeli izračunati vrednost naše formule za A=1, B=2 in C=3, bi funkcijo nekje v PHP kodi poklicali takole:

izracunaj(1,2,3);

Vrstni red argumentov je pomemben. V našem primeru lahko do števila 1 (ki je prvi argument) znotraj funkcije dostopamo prek imena prve spremenljivke - $a.

Argumente je sicer dovoljeno izpuščati, vendar bo PHP tolmač javil Warning. Stopnjo opozarjanja lahko nastavljate v datoteki php.ini ali pa na začetek PHP kode dodajte ini_set("display_errors", "Off");, da skrijete obveščanje o napakah.

Seveda bi lahko kot argumente funkcije dali tudi imena spremenljivk, celo z enakim imenom kot znotraj (ker gre za dva različna nivoja spremenljivk - ene so veljavne samo zunaj funkcije, druge pa samo znotraj nje.)

$a = 1; $b = 2; $tretje = 3;
izracunaj($a,5,$tretje); // $b, ki je zgoraj nastavljen na 2, ne vpliva na $b znotraj funkcije,
                         // ki bo imel vrednost 5
Funkcijo lahko definiraš tudi pod samim klicem - program bo še vedno pravilno deloval:
test(1,2);

function test($a,$b) {
    print $a . $b;
}

V skladu s prejšnjo trditvijo moraš vse spremenljivke, do katerih bi želel dostopati znotraj funkcije, podati kot njene argumente.

NAROBE:

$ime = "Marko";

function izpisi($stevilo) {
    print $ime . $stevilo; // želimo izpisati ime in število
}

izpisi(1); // klic funckije - izpiše: "1";

PRAV:

$ime = "Marko";

function izpisi($ime,$stevilo) {
    print $ime . $stevilo;
}

izpisi($ime,1); // izpiše: "Marko1";

Pa vendar obstaja še tretja možnost, kjer uporabimo ukaz global, da lahko znotraj funkcije dostopamo do zunanjih spremenljivk:

$ime = "Marko";

function izpisi($stevilo) {
    global $ime;
    print $ime . $stevilo;
}

izpisi(1); // izpiše: "Marko1";

Privzete vrednosti

Denimo, da imamo funkcijo, ki sprejme 2 argumenta, ob klicu pa ji podamo samo en argument. Ugotovili smo že, da bo zaradi tega prišlo do Warning-a. Kako bi ta problem rešili? V sami definiciji funkcije lahko določimo privzete vrednosti argumentov, ki se bodo uporabile, če teh argumentov ne bomo podali. Oglejmo si primer seštevanja dveh števil, pri čemer funckiji ob klicu podamo samo en argument namesto dveh:

function sestej($prvo=0,$drugo=0) {
    print $prvo + $drugo;
}

sestej(3);

Ker smo podali samo argument na prvem mestu ($prvo), se bo za drugo število ($drugo) vzela njegova privzeta vrednost - 0. Privzete vrednosti dodamo v seznam argumentov neke funkcije in sicer na koncu vsake spremenljivke, za enačajem (=).

Zgornja funkcija bo zato izračunala račun 3 + 0 in na zaslon izpisala "3", pri tem pa PHP tolmač napake ne bo javil.

Vračanje vrednosti z return

Vrnimo se na ukaz return. Z razliko od ukaza print, ki ga lahko kjerkoli uporabimo poljubno mnogokrat, se v funkciji ukaz return uporabi samo enkrat. Vsaka funkcija lahko tako vrne samo en rezultat, recimo neko število ali besedo. Ukaz return rezultata ne izpiše na zaslon.

Primer:

Spodnja funkcija vrne seštevek dveh števil. Kot vidite, lahko vrednost, ki jo ta funkcija vrne z ukazom return prestrežemo z ukazom print in jo tako izpišemo na zaslon. Bodi pozoren tudi na 3. vrstico, ki se ne bo izvedla, ker ukaz return prekine izvajanje funkcije.

function sestej($prvo,$drugo) {
    return $prvo + $drugo;
    print "tole se ne bo izpisalo";
}

print sestej(3,5);

/* seveda lahko namesto neposrednega izpisa vrednost, ki jo funkcija vrne, shranimo v neko
spremenljivko, recimo z imenom rezultat in le-to nato izpišemo: */

$rezultat = sestej(3,5);
print $rezultat;

Vgrajene funkcije v PHPju

PHP ima seveda zelo veliko vgrajenih funkcij, od takih za matematične izračune pa do takih za delo z bazami podatkov. Spisek vseh funkcij po kategorijah si lahko ogledaš tukaj.

Primer uporabe funkcije rand() (ki generira naključna števila) za simulacijo igralne kocke:

print rand(1,6);

Vse o tej funkciji izveš na tejle strani. Odpri jo. Pod Description boš opazil naslednje:

int (1) rand (2) ( [(3)int min(4), int max(5)] )

(1): Podatkovni tip, ki ga funkcija vrne. int pomeni, da funkcija vrne celo število (integer).
(2): ime funkcije - v tem primeru je to rand
(3)
: oglati oklepaji okrog argumentov pomenijo, da le-ti niso obvezni
(4): 1. argument: int pomeni, da mora biti tipa celo število, min pa je notranje ime tega argumenta - to pomeni, da se znotraj funkcije do vrednosti tega argumenta dostopa prek $min
S tem argumentom določimo najmanjše število, ki ga lahko funkcija za naključna števila vrne.
(5): 2. argument: podobno kot 1. argument, razlika je samo v tem, da s tem argumentom določimo največje število, ki ga lahko funkcija za naključna števila vrne.

Poleg tipa int obstaja še tip double (realna števila) ter tipi string (nizi), array (polja spremenljivk - o tem več naslednjič), mixed (pomeni, da lahko funkcija sprejme enega od več možnih podatkovnih tipov), bool (se npr. uporablja pri funkcijah tako, da funkcija vrne true, če je bilo opravilo uspešno izvedeno, v nasprotnem primeru pa false) in null (kar npr. pomeni, da neka spremenljivka nima vrednosti).
Več o tipih si lahko prebereš tukaj.

Naprej v dokumentaciji se nahajajo primeri (pod Example), nato pa še komentarji uporabnikov (pod User Contributed Notes).

Naš programček bi lahko še izboljšali, če si iz strani http://games.emax.dk/images/ sposodimo slike igralnih kock:
1 23456

Ker je že iz imen datotek s slikami kock razvidno, koliko pik imajo, lahko naredimo takešn programček:

$pike = rand(1,6);
print "<img src='http://games.emax.dk/images/dice{$pike}.gif' alt='kocka'/>";

Sedaj bomo namesto "grobega" izpisa števila pik vsakič dobili sličico kocke.

Preizkusimo še eno funkcijo, s katero lahko zamenjujemo znake v nizih. Recimo, da naša spletna aplikacija ne dovoljuje šumnikov in jih moramo zamenjati s c/z/s. Za ta namen uporabimo funkcijo str_replace.

Najlažje o neki funkciji informacije dobiš tako, da jo napišeš na koncu naslova http://si2.php.net/, npr.
http://si2.php.net/str_replace

Primer programa (uporabo funkcije si za vajo poglej sam):

$ime = "Žane Čeh Šlokar";
$ime = str_replace("Č","C",$ime); // zamenjamo velike šumnike s C/Z/S
$ime = str_replace("Ž","Z",$ime);
$ime = str_replace("Š","S",$ime);
$ime = str_replace("č","c",$ime); // zamenjamo male šumnike s c/z/s
$ime = str_replace("ž","z",$ime);
$ime = str_replace("š","s",$ime);
print $ime; // izpiše: Zane Ceh Slokar

Seveda ni pri vseh funkcijah pomembno tisto, kar vračajo. Včasih želimo samo sprožiti nek postopek. Primer je funkcija mail(), s katero lahko pošiljamo elektronsko pošto (če je strežnik pravilno nastavljen).

V našem XAMPP strežniku moramo v beležnici odpreti datoteko C:\Program Files\xampp\apache\bin\php.ini in v 695. vrstici "localhost" zamenjati z recimo mail.siol.net (za SiOLove uporabnike) ali podobnim imenom strežnika za odhajajočo pošto (SMTP) vašega ISPja ter nato v 699. vrstici odstraniti podpičje (ki označuje komentar) na začetku vrstice in namesto me@example.com napisati svoj elektronski naslov. Nato moramo konzolo strežnika zapreti in XAMPP še enkrat zagnati.

Nato lahko elektronsko sporočilo pošljemo takole:

mail("vaš@e-naslov.si","naslov sporočila","besedilo sporočila");

Vgrajene funkcije - delo z nizi

PHP ima zelo veliko funkcij za delo z nizi. Naštejmo nekaj uporabnejših:

print - že znana funkcija za izpis besedila (nizov, števil,...) v HTML kodo
strlen - kot argument sprejme niz ali spremenljivko z nizom in vrne njeno dolžino
substr - s to funkcijo lahko iz niza vzamemo samo njegov določen del
strpos - ta funkcija vam vrne položaj nekega podniza v nizu
str_replace - s to funkcijo lahko zamenjate znake ali nize v nekem nizu
md5 - funkcija izračuna MD5 hash podanega niza - uporabno za kodiranje gesel

Zaključek snovi za ta teden

Prekratko? Še enkrat natančno vse preberi. Funkcije so poleg zank in pogojnih stavkov najpomembnejši gradniki sodobnih programskih jezikov. Ko si se prepričal, da vse razumeš, pa le veselo na naloge tega tedna.