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.
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 (})
function ime_funkcije(argumenti) {
/* koda funkcije
koda funkcije /*
}Tako smo zaviti oklepaj premaknili v isto vrstico kot za
definicijo 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.
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
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";
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.
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;
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.
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:





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.
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");
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
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.