Kirjoittaja: Antti Laaksonen (2011).
Olemme käyttäneet opassarjan kuluessa monia PHP:n valmiita funktioita. Esimerkiksi funktio strlen
kertoo merkkijonon pituuden ja funktio round
pyöristää luvun kokonaisluvuksi. Tässä oppaassa opimme tekemään vastaavia funktioita itse.
Funktioiden tarkoituksena on helpottaa koodin kirjoittamista ja selkeyttää sen rakennetta. Esimerkiksi jos koodissa toistuu monta kertaa lähes samanlainen osuus, tekemällä funktion samaa koodia ei joudu monistamaan.
Seuraavassa koodissa on itse tehty funktio tervehdi
:
<?php function tervehdi() { echo "<i>Heippa!</i> <br>"; } tervehdi(); tervehdi(); tervehdi(); ?>
Funktio tervehdi
tulostaa viestin "Heippa!" ja rivinvaihdon. Funktiota kutsutaan koodissa kolmesti, joten koodi tuottaa seuraavan sivun:
Funktioon liittyy yleensä parametreja, jotka tarkentavat, mitä funktion on tarkoitus tehdä. Esimerkiksi voimme lisätä funktioon tervehdi
parametrin $viesti
:
<?php function tervehdi($viesti) { echo "<i>{$viesti}</i> <br>"; } tervehdi("Heippa!"); tervehdi("Moikka!"); tervehdi("Tsaukki!"); ?>
Nyt funktiota kutsuessa parametri $viesti
ilmoittaa, millä tavoin funktio tervehtii. Tässä tapauksessa koodi tuottaa seuraavan sivun:
Laajennetaan vielä funktiota niin, että sille voi antaa parametrina myös viestin toistokertojen määrän:
<?php function tervehdi($viesti, $kerrat) { for ($i = 0; $i < $kerrat; $i++) { echo "<i>{$viesti}</i> <br>"; } } tervehdi("Heippa!", 5); ?>
Tämän muutoksen jälkeen koodi tuottaa seuraavan sivun:
Seuraavassa esimerkissä funktio valintalista
helpottaa valintalistojen luontia:
<?php function valintalista($nimi, $sisalto) { echo "<select name=\"{$nimi}\">"; foreach ($sisalto as $kohta) { echo "<option value=\"{$kohta}\">{$kohta}"; } echo "</select>"; } echo "<p>Valitse syntymäpäiväsi:</p>"; valintalista("paiva", range(1, 31)); valintalista("kuukausi", range(1, 12)); valintalista("vuosi", range(1900, 2010)); ?>
Koodi tuottaa seuraavan syntymäpäivän valinnan:
Valitse syntymäpäiväsi:
Tässä funktio range
muodostaa taulukon, joka sisältää luvut annetulta väliltä. Esimerkiksi range(1, 5)
tarkoittaa taulukkoa array(1, 2, 3, 4, 5)
.
Seuraavassa koodissa funktiolla keskiarvo
on palautusarvo:
Funktiolle annetaan parametrina kaksi lukua, ja funktio palauttaa niiden keskiarvon komennolla return
. Palautusarvo välittyy kohtaan, jossa funktiota kutsutaan muualla koodissa. Tässä tapauksessa koodi tulostaa "Keskiarvo: 5".
Komento return
poistuu heti funktiosta, vaikka komento olisi keskellä funktiota. Komentoa voi käyttää myös ilman palautusarvoa, jolloin komennon ainoa tarkoitus on poistua funktiosta.
Seuraava funktio tarkistaa sähköpostiosoitteen muodon:
<?php function tarkista($osoite) { $pituus = strlen($osoite); if ($pituus < 5 || $pituus > 256) { return false; } if (substr_count($osoite, "@") == 1) { return true; } else { return false; } } if (tarkista("aapeli@ohjelmointiputka.net")) { echo "Osoite kelpaa!"; } else { echo "Osoite ei kelpaa!"; } ?>
Funktio palauttaa arvon true
, jos osoite näyttää kelvolliselta, ja muuten arvon false
. Funktio vaatii, että osoitteen pituus on 5–256 merkkiä ja siinä on tasan yksi @-merkki. Tässä funktio substr_count
kertoo, kuinka monta kertaa merkkijono esiintyy toisen merkkijonon osana.
Tässä on sama funktio hieman lyhyemmin:
function tarkista($osoite) { $pituus = strlen($osoite); return $pituus >= 5 && $pituus <= 256 && substr_count($osoite, "@") == 1; }
Seuraavassa koodissa funktion parametreilla on oletusarvot:
<?php function tervehdi($viesti = "Heippa!", $kerrat = 1) { for ($i = 0; $i < $kerrat; $i++) { echo "<i>{$viesti}</i> <br>"; } } tervehdi(); tervehdi("Moikka!"); tervehdi("Tsaukki!", 3); ?>
Nyt funktiolle voi antaa kutsussa 0–2 parametria. Jos parametri $viesti
puuttuu, oletusarvo on "Heippa!", ja jos parametri $kerrat
puuttuu, oletusarvo on 1. Koodi tuottaa seuraavan sivun:
Kaikkien valinnaisten parametrien on oltava funktion parametrien lopussa, jotta on selvää, mitä funktiolle annetut parametrit tarkoittavat.
Funktiossa ovat oletuksena käytössä vain muuttujat, joille on annettu arvo funktion sisällä. Esimerkiksi seuraava koodi ei tulosta lukua 5, koska muuttuja $luku
ei ole käytössä funktion sisällä:
<?php function testi() { echo $luku; } $luku = 5; testi(); ?>
Jos ulkopuolista muuttujaa haluaa käyttää funktion sisällä, muuttuja täytyy määritellä globaaliksi sanalla global
. Seuraava koodi tulostaa halutusti luvun 5:
<?php function testi() { global $luku; echo $luku; } $luku = 5; testi(); ?>
Tavallisesti kaikki funktion muuttujat häviävät, kun funktion suoritus päättyy. Jos muuttujan haluaa säilyvän kerrasta toiseen, muuttuja täytyy määritellä staattiseksi sanalla static
. Seuraava koodi tulostaa ensin 1, sitten 2 ja lopuksi 3:
<?php function testi() { static $luku = 1; echo $luku; $luku++; } testi(); testi(); testi(); ?>
Funktioista on kahdenlaista hyötyä ohjelmoinnissa:
Jos koodissa esiintyy monta kertaa käytännössä samanlainen osa, siitä kannattaa usein tehdä funktio, jolloin samanlainen koodi tarvitsee kirjoittaa vain kerran. Tällöin koodin pituus lyhenee ja jos funktioon tulee muutoksia, muutos riittää tehdä yhteen paikkaan koodissa.
Toisaalta funktioiden käyttäminen selventää usein koodia. Jos pitkä koodi on toteutettu ilman funktioita, se on helposti sekava ja koodin yleisrakennetta on vaikeaa hahmottaa. Jakamalla koodi pienempiin funktioihin se pysyy paremmin hallinnassa.
Ostin iPadiin noin 50€ maksavan kirjan PHP:stä. Funktioiden kohdalla esimerkit olivat käsittämättömiä verrattuna tähän häkellyttävän hienosti tehtyyn funktio oppaaseen.
Uusi koodari älä huoli jos opas ei aukea ekalla tai tokalla kertaa. Opettele perusteet, palaa sitten tähän oppaaseen ja mieti miten käyttäisit näitä malleja omassa projektissasi. Funktiokirjaston rakentaminen olisi myös mukava lisä, mutta toisaalta turha mennä asioiden edelle, kiitos upeasta oppaasta ja ihmeen korkeasta tasosta joka säilyy oppaita sellaillessa. Ohjelmointiputkan hyöty funktioita opetellessa on korvaamaton, tämä laittaa miettimään. Missä ja miten funktiot olisivat auenneet näin jos ei tällä sivulla.
Sen verran tuohon voisi lisätä, että nuo funktioiden parametrit ovat oletusarvoisesti value-tyyppisiä, eli kutsuvasta paikasta annettava parametrin arvo kopioidaan parametrin arvoksi.
Referenssityyppisten arvojen käyttö on myös mahdollista. Tällöin funktio in muotoa
function phpfunktio(&$parametri) { $parametri="jotakin..."; // parametriä käytetään normaalin // muuttujan tavoin, paitsi että muuttujaan // tehdyt muutokset näkynät "kutsuvan" // koodin muuttujassa. }
Esim.
Aikoinani tuhtasin qbasic ohjemia oikein ammattini käyttöön.
Geomerin luontiin sekä CNC ohjeman luontiin Geometrisetä kuvasta.Koodi oli ISO G-coodia.
Ohessa syntyi kivoja efektejä näytölle joita silloin tällöin vieläkin ihastelen.
Ohjelmat olivat tosi tarpeeseen kun muuten olisin saanut laskimella laskeskella viikoja 2-3 tuhatta riviä pitkiä ohjelmia.
Aloitus tapahtui jo GW-basic aikaan. Basic ei riittänyt rarpeisiin tai ei taidot, konekin oli Zenit ja Dos 3.1.löytynee vielä, jos ei korppu ole vikaantunut.
Joku teistä varmasti suorittaa samat tehtävät puolella koodimäärällä mutta minun oli pärjättävä omillani.
Jos joku haluaa niin voin laittaa joitakin ohjelmia tulemaan palstalle.
Ihan simppelitä ne eivät ole.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.