Funkcije se pišu tako da se navede ključna riječ function, nakon koje dolazi ime funkcije i par okruglih zagrada.
Poslije njih, u vitičastim zagradama pišu se naredbe koje će funkcija obaviti:
function imeFunkcije()
{
naredba1;
naredba2;
}
Za imenovanje funkcija vrijede ista pravila kao i za imenovanje varijabli: mogu se koristiti slova, brojevi i povlaka (_), a ime funkcije može početi slovom ili povlakom.
Ime funkcije ne smije biti jednako imenu već postojeće funkcije u istoj datoteci, imenu ugrađene funkcije ili ključnoj riječi PHP-a.
Jednostavna funkcija koja će ispisati neki tekst izgledat će ovako:
function IspisiPozdrav()
{
echo "Pozdrav, svijete!";
}
Poziv te funkcije izgledat će ovako:
IspisiPozdrav();
Da bi se funkcija mogla pozvati, definicija funkcije mora se nalaziti u istoj datoteci kao i poziv funkcije.
Nije nužno da je definicija funkcije u datoteci napisana prije njenog poziva.
Prilikom poziva, funkciji se mogu predati određeni podaci koje će ona upotrijebiti.
Ti podaci se nazivaju argumentima ili parametrima funkcije i moraju se navesti prilikom definicije funkcije.
Prilikom navođenja argumenata navodi se samo njihovo ime, a ne navodi se tip podatka.
function imeFunkcije($argument1, $argument2)
{
naredba1;
naredba2;
}
Primjer funkcije koja prima dva argumenta:
function Mnozi($a, $b)
{
echo $a * $b;
}
Ova funkcija pomnožit će dva zadana broja i ispisati njihov umnožak.
Njen poziv izgledat će ovako:
Mnozi(4,2);
Pri pozivu funkcije moraju se uvijek navesti svi argumenti.
Iznimka od toga su predefinirani argumenti čije se vrijednosti zadaju prilikom definicije funkcije.
U ovom primjeru se kao predefinirana vrijednost argumenta $b zadaje 2:
function Mnozi($a, $b = 2)
{
echo $a * $b;
}
Najčešći način prijenosa argumenata funkciji je prijenos po vrijednosti kod kojeg se vrijednost argumenta kopira u novu varijablu.
U sljedećem primjeru, funkcija Povecaj povećava predanu vrijednost za 1.
Moglo bi se očekivati da će nakon povratka iz funkcije vrijednost varijable $broj biti uvećana za 1, ali to se ne događa.
function Povecaj($a)
{
$a++;
echo "Vrijednost u funkciji: $a <br />";
}
$broj = 2;
Povecaj($broj);
echo "Vrijednost nakon povratka iz funkcije: $broj";
Razlog tome je što funkcija dobiva kopiju vrijednosti, a ne originalnu varijablu, te izmjena varijable u funkciji nema utjecaja na vrijednost originalne varijable.
Stvaranjem reference na varijablu, za što se koristi operator &, postiže se da obje varijable (referencirana i originalna varijabla) sadrže istu vrijednost Izmjena jedne varijable rezultirat će promjenom vrijednosti obje varijable.
$a = 1;
$b = &$a;
echo "$a $b <br/>"; // 1 1
$a++;
echo "$a $b <br/>"; // 2 2
$b++;
echo "$a $b"; // 3 3
U drugoj naredbi stvara se varijabla $b kao referenca na varijablu $a. Nakon toga, obje varijable pokazuju na istu vrijednost, i promjena na bilo kojoj od njih utječe na drugu varijablu.
Reference se mogu koristiti prilikom prijenosa argumenata u funkciju. Umjesto da se funkciji preda kopija argumenta, funkciji se predaje referenca koja pokazuje na originalnu vrijednost. U tom slučaju, izmjene napravljene na argumentu vrijedit će i nakon povratka iz funkcije.
Ako se unutar funkcije želi izmijeniti originalna vrijednost argumenta, potrebno je umjesto vrijednosti argumenta predati referencu na njega.
Uz vraćanje rezultata na način da se promijeni argument prenesen po referenci, postoji i češće korišteni način vraćanja rezultata funkcije, upotrebom ključne riječi return.
Funkcija koja množi dva broja i vraća rezultat množenja pomoću ključne riječi return, izgledat će ovako:
function Mnozi($a, $b)
{
return $a * $b;
}
Poziv funkcije:
$c = Mnozi(3,5);
echo $c; //15
Ključna riječ return označava izlazak iz funkcije.
Ako se iza nje nalazi još neka naredba, ona neće biti izvršena.
Ključna riječ return može se koristiti i za izlazak iz funkcije bez vraćanja rezultata:
function IspisiTekst($tekst)
{
if ($tekst == "")
{
return;
}
echo $tekst;
}
Ako se funkciji IspisiTekst u gornjem primjeru preda prazan znakovni niz, ona neće ispisati ništa jer će se izvršavanje funkcije prekinuti prije naredbe echo.