PHP Funktioner
Vad är en funktion?
En funktion kan i mångt och mycket jämföras med en fabrik. Den tar in råvara och spottar ut en färdig produkt. Ibland behövs ingen råvara. Ibland utförs något istället för att spotta ut en färdig produkt.
En funktion startar utan data eller tar emot data, och sedan gör den något som slutar med att den utför något eller returnerar något.
Inbyggda funktioner i PHP
Det finns många färdiga funktioner som är inbyggda i PHP. En del av dessa kommer vi bekanta oss med efterhand i kursen. Syftet med denna sida är att lära sig bygga egna funktioner.
Exempel på funktioner
Här följer ett några exempel på funktioner.
Funktion utan parameter som utför något
function skriv() {
echo "Tjoflöjt!";
}
?>
som anropas med:
skriv();
?>
Funktion med parameter som utför något
function skrivut($något) {
echo $något;
}
?>
som anropas med:
$text="Snövit och de sju dvärgarna";
skrivut($text);
?>
Funktion med parameter som returnerar ett svar
Denna funktion tar emot ett tal, ökar talet med 17, och skickar tillbaks resultatet:
<?php
function increaseSeventeen($tal) {
$tal = $tal+17;
return $tal;
}
?>
som anropas med:
$nr=9;
echo $nr;
$nyttNr = increaseSeventeen($nr);
echo "<br>".$nyttNr;
?>
26
Visst är det enkelt? Vi bryter nu ner koden och förklarar den.
Raden som lyder "$nyttNr = increaseSeventeen($nr);" innebär att
variabeln $nyttNr kommer resultatet från funktionen increaseSeventeen
sparas. Vad som finns inom parentesen är vad vi skickar till vår
funktion, i det här fallet heltalet 9. Väl inne i vår fabrik
(funktion) ökas talet med 17 och resultatet 26 skickas tillbaka och skrivs
ut. Inga svårigheter, eller hur?
PHP har färdiga funktioner
PHP har en enorm massa användbara inbyggda funktioner, jag demonstrerar här en funktion som använder sig av en av de inbyggda funktionerna. Det är ju så att funktionen increaseSeventeen inte vet att det är ett tal den tar emot, om den skulle ta emot t.ex. en textsträng skulle det hända konstiga saker. Så, vi använder oss av två av de inbyggda funktionerna för att kolla om det är ett tal funktionen tagit emot.
<?php
function increaseSeventeen($tal) {
if(is_numeric($tal) == TRUE) {
$tal = $tal+17;
}
else {
$tal = "$tal är inte ett tal! FEL!";
}
return $tal;
}
$nr=9;
echo $nr;
$nyttNr = increaseSeventeen($nr);
echo "<br>".$nyttNr;
$nr="Kalle Anka";
echo "<br>".$nr;
$nyttNr = increaseSeventeen($nr);
echo "<br>".$nyttNr;
?>
26
Kalle Anka
Kalle Anka är inte ett tal! FEL!
Vad händer här då? Jo, i den nya if-satsen används den
inbyggda funktionen "is_numeric", den tar emot en variabel och undersöker
om den är ett tal, är detta sant (TRUE) så ökar den
talet med 17 och skickar tillbaka resultatet.
Skulle $tal däremot inte vara ett tal utförs det som finns i else-blocket,
vi skriver in att det inte är ett tal.
Funktioner med defaultparameter
En kan funktion kan anropas med färre antal parametrar än vad som finns i deklarationen, normalt sätter man ett defaultvärde på de som eventuellt kan utelämnas. OBS! Funktionen räknar parametrar från vänster, så hoppar du över en parameter så antar den att det är den sista.
//en funktion som skriver ut något:
function skrivFlera($text, $ggr=4) {
for ($i=0;$i<$ggr;$i++) echo "$text";
}
?>
<?php
//och som anropas med:
skrivFlera("Tjoflöjt", 2);
echo "<br>Nu utan den andra parametern:<br>";
skrivFlera("Tjoflöjt");
?>
Nu utan den andra parametern:
TjoflöjtTjoflöjtTjoflöjtTjoflöjt
Funktioner med referensparameter
När vi vill skicka tillbaks data från flera variabler i en funktion så får vi problem. Ett sätt att lösa detta är genom att använda referensparametrar. Det innebär att varabelnamnet i funktionen blir en alias för variabeln som man skickade med i huvudprogrammet. Man kan även beskriva det som att båda namnen pekar på (refererar till) samma minnesutrymme.
För att tala om att en parameter i funktionen ska vara av typen referens så sätter man &-tecknet framför. Vi behöver då ingen return-sats.
Här är ett första exempel:
//en funktion som lägger till lite text:
function addText(&$temp) {
$temp.=" Hej svejs i lingonskogen!<br>";
}
?>
<?php
//som anropas med:
$text="Tjoflöjt";
echo "<br>Innan funktionsanrop:<br>$text";
addText($text);
echo "<br>Efter funktionsanrop:<br>$text";
?>
Innan funktionsanrop:
Tjoflöjt
Efter funktionsanrop:
Tjoflöjt Hej svejs i lingonskogen!
Funktioner med array som parameter
En funktion kan ta emot en array som parameter likaväl som data från vanliga variabler.
För att få tillbaks arrayen från en funktion så kan vi använda return-satsen. Den fungerar även för array. Vi kan även här använda referensanrop vilket är mycket smidigt.
//en funktion:
function addNumber($minlista) {
$minlista[0]+=555;
$antal=count($minlista);
$minlista[$antal]=123;
return $minlista;
}
?>
<?php
//som anropas med:
$lista[0]=21;
$lista[1]=31;
$lista[2]=41;
$lista[3]=51;
echo "<br><br>Utskrift före funktionen från huvudprogrammet:<br>";
$antal=count($lista);
echo "$antal tal i listan<br>";
foreach ($lista as $value) echo "$value<br>";
$lista=addNumber($lista);
echo "<br><br>Utskrift efter funktionen från huvudprogrammet:<br>";
$antal=count($lista);
echo "$antal tal i listan<br>";
foreach ($lista as $value) echo "$value<br>";
?>
Utskrift före funktionen från huvudprogrammet:
4 tal i listan
21
31
41
51
Utskrift efter funktionen från huvudprogrammet:
5 tal i listan
576
31
41
51
123
En array som parameter är som default värdeanrop. Men genom att skicka deklarera parametern som referens framför funktionens parameter så ändrar vi det till ett referensanrop. Det vill säga "$minlista" i funktionen är en alias som pekar på de ordinarie lådorna. Det vill säga samma lådor som "$lista" i huvudprogrammet pekar på. Därför behövs inte return-satsen eftersom den lokala variabeln $minlista pekar på samma utrymme i arbetsminnet som $lista i huvudprogrammet.
//en funktion:
function addNumber(&$minlista) {
$minlista[0]+=555;
$antal=count($minlista);
$minlista[$antal]=123;
}
?>
<?php
//som anropas med:
$lista[0]=21;
$lista[1]=31;
$lista[2]=41;
$lista[3]=51;
echo "<br><br>Utskrift före funktionen från huvudprogrammet:<br>";
$antal=count($lista);
echo "$antal tal i listan<br>";
foreach ($lista as $value) echo "$value<br>";
addNumber($lista);
echo "<br><br>Utskrift efter funktionen från huvudprogrammet:<br>";
$antal=count($lista);
echo "$antal tal i listan<br>";
foreach ($lista as $value) echo "$value<br>";
?>
Utskrift före funktionen från huvudprogrammet:
4 tal i listan
21
31
41
51
Utskrift efter funktionen från huvudprogrammet:
5 tal i listan
576
31
41
51
123
Funktioner med valfritt antal parametrar
En specialare som PHP har är funktioner men ett valfritt antal parametrar.
//en funktion:
function valfrittAntalParametrar() {
// hur många värden har funktionen fått?
$antalParametrar = func_num_args();
// vilka värden är det, lagra i en array
$parameterLista = func_get_args();
// summera medskickade värden
$summa = 0;
for ( $i = 0; $i < $antalParametrar; $i++ )
{
$summa += $parameterLista[$i];
}
return $summa;
}
?>
<?php
//anropas med:
// testar lite olika varianter
echo valfrittAntalParametrar();
echo "<br>";
echo valfrittAntalParametrar(1,5,10);
echo "<br>";
echo valfrittAntalParametrar(1,2,3,4,5,6,7,8,9,10);
echo "<br>";
?>
0
16
55
Hoisting - Deklarera funktioner efter anrop
Här är ett exempel på detta.
skrivTjoflöjt();
function skrivTjoflöjt() {
echo "Tjoflöjt!";
}
?>
Funktioner behöver inte vara deklarerade innan de anropas, så länge som de finns någonstans på sidan. PHP går igenom hela sidan först en gång och noterar vissa saker. Sen exekveras(interpreteras) sidan. Detta kallas "hoisting".
Funktionsuttryck fungerar annorlunda
Detta gäller dock inte funktions-uttryck. Dessa exekveras enligt "top-down" ordning. Funktionsuttryck kopplas till en variabel och har inget funktionsnamn (kallas för anonyma funktioner).
Ett exempel:
Om vi skriver
innan deklarationen av "skrivBuu"-variabeln så kommer programmet krascha.
Funktionsdeklarationen är syntaktiskt ganska separat från funktionsuttrycket, även om de ser nästan identiska ut.