PHP
PHP KOULUTUSTA VUONNA 2025!
-
PHP koulutus
-
WordPress PHP-devaajalle koulutus
-
MySQL koulutus
-
Apache HTTPd koulutus
-
Microsoft IIS koulutus
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.