Guide: PHP- & MySQL-innføring: Kapittel 5
Funksjoner
Programmeringsspråket PHP har blitt svært populært de siste årene. Vi fortsetter introduksjonen og tar for oss funksjoner.
Side 1: Introduksjon
PHP er et svært bredt programmeringsspråk, og det tar derfor noe tid å dekke alt. I det første kapittelet har vi dekket grunnleggende bakgrunnsinformasjon om PHP, hva det er og brukes til.
I det andre kapittelet dekket vi grunnleggende syntaks, variabler, uttrykk og utskrift.
I kapittel tre, gikk vi gjennom kontrollstrukturer som lar deg vise ulik informasjon til brukeren avhengig av verdien til variabler, og løkker som lar deg gjenta instruksjoner flere ganger.
Forrige gang, i kapittel fire, gikk vi gjennom arrays. I dag er temaet for diskusjonen funksjoner i PHP.
Funksjoner benyttes hovedsakelig for å unngå å skrive en bit kode om igjen flere ganger. Du kan gjerne tenke på funksjoner i PHP som matematiske funksjoner; du gir funksjonen en eller flere inn-verdier og den gir deg et resultat. Til forskjell fra vanlige matematiske funksjoner kan en PHP-funksjon også endre inn-verdiene, et spesialtilfelle vi skal snakke mer om senere.
Dersom du har erfaring fra andre språk, kan det være at du har hørt om funksjoner tidligere, bare under et annet navn; metoder og prosedyrer er de mest vanlige betegnelsene på fenomenet.
Side 2: Hva er en funksjon?
Hva er en funksjon?
Selv om du kanskje ikke har vært klar over det, har vi brukt funksjoner tidligere i denne guiden. Kommandoene som er innebygd i PHP, slik som ”echo” og ”print” er funksjoner som sprÃ¥ket tilbyr. Blant slike funksjoner finner man ogsÃ¥ matematiske funksjoner, slik som f.eks. utregning av sinus (sin) og cosinus (cos).
Det interessante med funksjoner er at du også kan lage dine egne. En funksjon er en kodeblokk som på en måte er adskilt fra resten av koden din. I koden du skriver i funksjonen din har du kun tilgang på de variablene som er parametre til funksjonen.
Dette blir svært abstrakt uten et kodeeksempel, så derfor kommer det et slikt nå. Med det du har lært til nå er gjerne følgende det du ville gjort dersom du ønsket å regne ut arealet og omkretsen for en sirkel for 3 forskjellige sirkler;
<?php
$radius = 2;
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
$radius = 4;
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
$radius = 5;
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
?>
Som du ser blir dette fort ganske mye kode, selv for noe så enkelt som det å regne ut areal og omkrets for 3 tre sirkler. Ville det ikke vært kjekt om vi kunne skrevet noe så enkelt som SirkelInfo(3) for å få informasjonen om en sirkel med radius 3? Det kan vi fort ordne.
<?php
function SirkelInfo($radius)
{
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
}
SirkelInfo(2);
SirkelInfo(4);
SirkelInfo(5);
?>
Som du ser har vi sluppet unna med å skrive vår lange setning en gang, i stedet for tre ganger som vi gjorde i det forrige skriptet. I tillegg til dette blir det enklere å oppdatere utregningen dersom det viser seg at pi ikke er akkurat lik 3,14, siden vi nå bare må oppdatere dette to plasser, i stedet for seks.
Men det er mye her vi ikke har forklart. Først og fremst, for å definere en funksjon, bruker vi nøkkelordet function. Direkte etter dette ordet kommer navnet på funksjonen, som kan være omtrent hva du vil. Etterpå finner vi den såkalte parameterlisten i paranteser.
Parameterlisten angir hvilke variabler som vil være tilgjengelig for koden inne i funksjonen. I vårt eksempel benytter vi oss bare av ett parameter, $radius, som du kan se vi bruker flere ganger inne i funksjonen.
Etter parameterlisten kommer selve funksjonen, avgrenset av de vanlige klammeparentesene. Vår funksjon består bare av den ene linjen som begynner med echo, siden vi kan gjøre alle våre utregninger der.
Når du ønsker å kalle funksjonen du har laget, er du nødt til å skrive navnet dens etterfulgt av parenteser fylt med verdier for argumentene. Du kan gjerne sende inn variabler her, og variabelens verdi vil bli sendt til funksjonen.
Side 3: Vanlige feller
Vanlige feller
Merk at kode som kjøres i en funksjon ikke normalt har tilgang på variablene som er definert utenfor funksjonen. For å unngå forvirring kan det være lurt å forsøke å unngå variabler med samme navn definert i en funksjon og utenfor en funksjon. Skriptet nedenfor har akkurat samme utdata som skriptet på forrige side.
<?php
$radius = 8;
function SirkelInfo($radius)
{
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
}
SirkelInfo(2);
$ostekake = 4;
SirkelInfo($ostekake);
SirkelInfo(5);
?>
Om du ønsker å få tilgang til variable definert på utsiden av funksjonen, kan du gjøre det ved å bruke nøkkelordet global. Legg merke til at PHP benytter definisjonen på $radius som finnes der funksjonen blir kjørt, ikke der funksjonen er deklarert. Resultatet av skriptet nedenfor blir derfor det samme som for skriptet over.
<?php
function SirkelInfo()
{
global $radius; // bruk $radius-variabel fra utenfor funksjonen
echo "Sirkel med radius $radius har areal ".
($radius * $radius * 3.14)." og omkrets ".
(2 * 3.14 * $radius)."<br/>";
}
$radius = 2;
SirkelInfo();
$radius = 4;
SirkelInfo();
$radius = 5;
SirkelInfo();
?>
Dersom du ønsker å definere en funksjon som tar flere parametre, kan du lett gjøre det ved å separere variabelnavnene med et komma. Den følgende funksjonen og bruk av den er et eksempel på dette.
<?php
function Multipliser($faktor1, $faktor2)
{
echo "$faktor1 * $faktor2 = ".($faktor1 * $faktor2);
}
$verdi = 3;
Multipliser(2, $verdi);
?>
Utskriften fra denne funksjonen blir "2 * 3 = 6".
Side 4: Returnere verdier
Returnere verdier
Funksjonene du har sett til nå har kun skrevet ut tekst direkte til nettleseren. Som oftest benyttes funksjoner til å returnere en verdi, som du dermed kan jobbe videre med i koden din. Returnering av verdier gjøres ved hjelp av kommandoen return.
Vi kan gå tilbake til vårt tidligere eksempel med sirkler. Dersom du ønsker å finne ut det totale arealet for flere sirkler vil det være upraktisk å benytte seg av SirkelInfo som vi definerte tidligere. Vi lager derfor en ny funksjon som returnerer arealet av en sirkel i stedet for å skrive det ut.
<?php
function RegnUtSirkelAreal($radius)
{
return $radius * $radius * 3.1415;
}
$sum = 0;
for ($i = 1; $i < 5; $i++)
$sum += RegnUtSirkelAreal($i);
echo "Sirklene med radius fra 1 til og med 5 har ".
"et totalt areal på $sum<br/>";
?>
Her bruker vi en kortform som du ikke har sett før. += betyr legg til den følgende verdien til variabelen, og er en kortere måte å skrive $sum = $sum + $noeMer.
I tillegg til denne nye kortformen, inneholder snutten over en svært vanlig feil når det gjelder for-løkker. Om du ikke finner feilen ved å lese gjennom koden, prøv å kjør den, endre litt på koden og finn feilen. Svaret kommer på neste side.
Her bruker vi return-kommandoen til å si hva funksjonens verdi er. Merk at vi kun kan kalle return en gang i hver funksjon, siden kode etter return ikke vil bli kjørt. Det betyr at vi kan endre vår funksjon ovenfor til å forhindre input av feil data;
function RegnUtSirkelAreal($radius)
{
if ($radius < 0)
return 0;
return $radius * $radius * 3.1415;
}
Om du nå kaller denne funksjonen med en negativ radius, vil funksjonen alltid returnere 0 som areal, siden en sirkel ikke kan ha negativt areal. Dersom radiusen er mindre enn 0, vil return 0 bli kalt og linjen etterpå vil ikke kjøres.
Side 5: Returnere flere verdier
Løsning
Husker du den vanlige feilen som vi nevnte på forrige side? Feilen består i at den utskrevne teksten sier at vi skal summere arealet av sirkler med radius fra 1 til og med 5, mens vi i for-løkken faktisk bare summerer arealet for sirkler fra 1 til og med 4. Det er fordi forløkken avslutter i det øyeblikket $i blir lik 5, ikke rett etterpå. Ved å endre sjekken fra < til <= vil det fungere. Prøv!
Returnere flere verdier
Det er nå det begynner å bli gøy. PHP benytter seg av lister veldig mye, så dersom du ønsker å returnere flere verdier kan du gjøre det ved å lage en liste og returnere den. Du kan også returnere objekter, som vi ennå ikke har fortalt deg om, men som vi skal behandle i et senere kapittel.
Å lage en liste er svært enkelt, og vi kan endre vår tidligere SirkelInfo til å returnere en liste i stedet for å skrive ut teksten.
<?php
function SirkelInfo($radius)
{
$info['radius'] = $radius;
$info['areal'] = $radius * $radius * 3.14;
$info['omkrets'] = $radius * 2 * 3.14;
return $info;
}
$info = SirkelInfo(3);
echo "En sirkel med radius 3 har en omkrets ".
"på $info['omkrets'] og areal på $info['areal']<br/>";
?>
Et annet alternativ er å endre som blir sendt inn som parametre. Dette er en måte som bør brukes med omhu, og fungerer best dersom du ønsker at endringene du gjør i funksjonen også skal gjelde for variabelen som du bruker når du kaller funksjonen.
Her er det vanskelig å komme med et svært godt eksempel, så vi bruker noe så primitivt som en funksjon som legger til en til en verdi.
<?php
function LeggTilEn($verdi)
{
$verdi++;
}
$ost = 4;
LeggTilEn($ost);
echo $ost;
?>
Intuitivt vil du kanskje si at dette skriptet skriver ut tallet 5, men det stemmer ikke. Vi har ikke pÃ¥ noen mÃ¥te fortalt PHP at endringer gjort til $verdi ogsÃ¥ skal gjelde for variabelen den representerer. Stilen brukt ovenfor kalles ”call by value”, som indikerer at det kun er verdien som blir sendt til funksjonen.
Om vi ønsker at endringene også skal gjelde for den nye verdien, kan vi gjøre følgende;
<?php
function LeggTilEn(&$verdi)
{
$verdi++;
}
$ost = 4;
LeggTilEn($ost);
echo $ost; // Skriver ut 5
?>
Her er det et-tegnet (&) som gjør at funksjonen kan endre variabelen som blir sendt inn til funksjonen. I stedet for at funksjonen får sin egen kopi av variabelen $ost, som er det som skjer til vanlig, får funksjonen nå en referanse til den originale variabelen. Når variabelen endres i funksjonen, vil endringen derfor også skje med den eksterne variabelen.
På engelsk kalles dette pass by reference (når du sender inn en referanse), i motsetning til pass by value, som er standard.
Side 6: Oppsummering
Oppsummering
I dag har vi snakket om funksjoner, et svært viktig verktøy for å dele opp koden din og å la deg slippe å skrive den samme koden flere ganger. Å kunne se hvilken kode som er gjenbrukbar er ofte en egenskap som tar noe tid å lære seg, og du lærer det best med erfaring.
Vi har gått gjennom hva en funksjon er, og hvordan den defineres. Deretter dekket vi noen vanlige feller å gå i når man lager funksjoner, og hvordan man kan omgå dem. Så gikk vi gjennom hvordan man returnerer verdier, og til slutt hvordan man kan returnere mer enn en verdi fra en funksjon.
Neste gang skal vi snakke om hvordan man kan ta imot data fra en nettside, og hva man må passe på underveis. Å bruke data som brukeren gir oss er en svært viktig del av det å lage dynamiske websider.