PHP

PHP KOULUTUSTA VUONNA 2025!

Kurssit saatavilla kautta Suomen. Tule ja varaa oma koulutustapahtumasi heti! Koulutuksen järjestää asiantuntijasi Koulutus- ja konsultointipalvelu KK Mediat.

Funktioiden kirjoittaminen PHP:ssä

Mikä on funktio

PHP:ssä funktio on nimettyä koodilohkoa, jota voidaan kutsua ja suorittaa useita kertoja. Funktio voi palauttaa arvon tai suorittaa vain sille määrätyn toiminnallisuuden. Funktioiden avulla voidaan vähentää koodin toistuvuutta, ja parantaa koodin ylläpidettävyyttä ja selkeyttä.

Jos funktio on määritelty luokan (class) sisällä, kutsutaan sitä menetelmäksi (method).

Funktion perussyntaksi PHP:ssä

Funktio luodaan määrittelyllä:


// määritetään funktio
function funktionNimi() {
    # tee jotain 
    # palauta arvo
}


// suoritetaan funktio
funktionNimi();  


Avainsanaa function seuraa yksilöllinen nimitunniste. Funktioiden nimeämisessä suositellaan nk. camelCasing-nimeämistä.

Funktion palautusarvo määrätään return lauseella

Jos funktion halutaan palauttavan arvon, se tulee ilmaista return-rakenteella. Return keskeyttää funktion suorituksen, eikä sen jälkeen olevia rivejä enää suoriteta.


function sayHello(){
    return "Hello World!";
}

echo sayHello();  //Hello World!


Funktion sisällä voi olla myös useita return-lauseita. Tällöin suoritus loppuu aina ensimmäisenä kohdattavaan palautukseen:


function sayHello() {
    $iViikonPaiva = date("w");
    if ($iViikonPaiva == 0 || $iViikonPaiva == 6) {
	    return "Nauti viikonlopusta!";
	}
	else {
        return "Hyvää työviikkoa!";	
    }
}
 
print sayHello();  


Mikäli funktion halutaan toimivan vain toimintosarjana, ilman palautusarvoa, ei return-arvoa tarvitse määritellä. Esimerkiksi:


function sayHello(){
    print "Hello World!";
}

sayHello();  // Hello World!


Funktion parametrit

Funktiolle voidaan välittää syötteitä, jotka vaikuttavat sen suoritukseen. Näitä argumentteja kutsutaan funktion parametreiksi. Parametrit määritetään pilkulla eroteltuna muuttujalistauksena funktion nimen perässä olevien sulkujen sisällä. Esimerkiksi:



function doSum($luku1, $luku2) {
    $tulos = $luku1+$luku2;
    return $tulos;
}

print(doSum(1,2)); 

Funktion oletusparametrit

Mikäli funktion parametreille halutaan antaa oletusarvoiset lähtöarvot, tapahtuu se sijoittamalla arvo parametrilistassa. Mikäli vain osa parametreista saa oletusarvon, täytyy ne sijoittaa argumenttilistauksessa viimeiseksi.


function doSum($luku1=1, $luku2=1) {
    $summa = $luku1 + $luku2;
	return $summa;
}

doSum(); // 2; 
doSum(5,2); // 7

Rest parametrit (...$args)

JavaScriptin tavoin PHP tukee nk. rest-parametreja. Niiden avulla funktiolle voidaan lähettää vaihtuva ja ennalta tuntematon määrä parametreja.


function doSum(...$iNumbers) {
    $summa = 0;
    foreach ($iNumbers as $n) {
        $summa += $n;
    }
    return $summa;
}

doSum(1,2); // 3
doSum(1,1,1,1,1); // 5


Funktion tyyppimääritykset

PHP:n versiosta 8 alkaen funktioiden argumenteille ja palautusarvolle on voinut määrittää tietotyypin. Vaikka tietotyypin määrittely ei ole pakollinen käytäntö, parantaa se koodin laatua ja toimii hyvänä vaihtoehtona pakotetuille tyyppimuunnoksille ja kastauksille.

Alla olevassa esimerkissä sekä funktion parametreille että palautusarvolle on määrätty tietotyypiksi kokonaisluku:


function multiply(int $a, int $b): int {
    return $a * $b;
}

multiply(3,5); // 15


Mikäli funktio ei palauta arvoa return-lauseella, voi senkin määrittää funktiomäärittelyn yhteen palautustyypillä void:


function printMsg(): void {
    echo "Tämä funktio ei palauta arvoa.";
}

printMsg();


Mikäli parametrin tietotyyppi on vaihtuva, voi sen PHP8:sta eteenpäin määrittää nk. union-syntaksilla tyyppi|tyyppi|...:


function multiply(int|string $a, int|string $b): int {
    return (int) $a * $b;
}

multiply(1,2); //2
multiply ("1","2"); // 2
multiply ("123xyz",1); //123


declare(strict_types=1) pakottaa tiukan tyypityksen

declare(strict_types=1) on PHP7:n esittelemä direktiivi, joka pakottaa PHP:n käyttämään tiukkaa tyypitystä funktioissa. Kyseessä on teknisesti hyvin samankaltainen ratkaisu kuin Visual Basic-kielissä käytetty Option Explicit direktiivi, mutta sillä erolla että strict_types määrittely käyttäytyy yhtä tiukasti kuin esim. Javan-tyypitys.

Määrittely täytyy sijoittaa tiedoston alkuun ennen ensimmäisiä funktiomäärittelyjä:


declare(strict_types=1);

function multiply(int $a, int $b): int {
    return $a * $b;
}

multiply(3,5); // 15


Huom! declare(strict_types=1) ja union-tyypit voivat aiheuttaa TypeError-virheitä ilman eksplisiittiä tyyppimuunnosta.

Callback-funktiot

Yksi modernin PHP:n tärkeimmistä konsepteista ovat callback-funktiot. Callback tarkoittaa yksinkertaisesti sitä, että välitämme funktion argumenttina toiselle funktiona ja suoritamme sen myöhemmin. Koska PHP tukee ns. callable-tyyppiä, funktiot voidaan käsitellä arvoina ja käyttää niitä kuten muitakin muuttujia.


function sayHello($sName) {
    echo "Hello $sName";
}

function greet($sName, callable $fCallback) {
    $fCallback($sName);
}

greet('Keijo', 'sayHello');  // Tulostaa: Hello Keijo



Callback-funktiot ovat erityisen hyödyllisiä silloin, kun haluamme suorittaa jonkin toiminnon vasta kun jokin muu toiminto on valmis. Tämä on erityisen tärkeää asynkronisessa ohjelmoinnissa, kuten tapahtumankäsittelijöissä ja fetch/XHR-pyynnöissä sekä funktionaalisessa ohjelmoinnissa.

Callback voidaan määrittää myös nimettömänä (anonyyminä) funktiona:


greet("Keijo", function(string $name) {
    echo "Hei $name!";
});  // Hei Keijo


PHP:n nuolifunktio

PHP:n versiosta 7.4 alkaen myös JavaScriptistä tuttu nuolifunktio-syntaksi on tuettu:

Toisin kuin perusmuotoa oleva funktio, nuolifunktion täytyy aina palauttaa arvo.


$kerroKaksi = fn($luku) => $luku * 2;

echo $kerroKaksi(5); // Tulostaa 10


Klosuurit

Toinen modernin PHP:n keskeinen käsite ovat klosuurit (closure). Klosuuri syntyy, kun funktio palauttaa funktion, ja palautetulla funktiolla on pääsy ulompien funktioiden muuttujien arvoihin vaikka ulompi funktio olisi jo suoritettu.

Alle olevassa esimerkissä countTogether-funktio palauttaa toisen funktion, joka voi säilyttää ja päivittää summa-muuttujan arvon. Vaikka ulompi funktio on jo suoritettu, sisempi funktio voi silti käyttää ja muokata sen muuttujia kontekstissa:


function countTogether() {
    $summa = 0;
    return function($iNum) use (&$summa) {
        $summa += $iNum;
        echo $summa . PHP_EOL;
    };
}

$summaFn = countTogether();
$summaFn(5);  // 5
$summaFn(10); // 15
$summaFn(3);  // 18


Klosuuri erityisen kätevä piirre jos haluamme säilyttää tilaa funktioiden sisällä, mutta emme halua altistaa muuttujia globaalille näkyvyysalueelle.