Datakurser
Aktuell vecka: 48

Tillbaka till toppen

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.

Interna funktioner i denna installation av PHP: 1857

Exempel på funktioner

Här följer ett några exempel på funktioner.

Funktion utan parameter som utför något

<?php
function skriv() {
    echo "Tjoflöjt!";
}
?>

som anropas med:

<?php
skriv();
?>
Tjoflöjt!

Funktion med parameter som utför något

<?php
function skrivut($något) {
    echo $något;
}
?>

som anropas med:

<?php
$text="Snövit och de sju dvärgarna";
skrivut($text);
?>
Snövit och de sju dvärgarna

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:

<?php
$nr=9;
echo $nr;
$nyttNr = increaseSeventeen($nr);
echo "<br>".$nyttNr;
?>
9
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
?> 
9
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.

<?php
//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");
?> 
TjoflöjtTjoflö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:

<?php
//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.

Till skillnad från många andra språk vad gäller arrayer som parameter till en funktion är att i php är "default" värdeanrop, det vill säga hela arrayen kopieras till en lokal array i funktionen.

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.

<?php
//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.

<?php
//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.

<?php
//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>"; 
?>
en funktion som anropas medolika antal parametrar:
0
16
55

Hoisting - Deklarera funktioner efter anrop

Här är ett exempel på detta.

<?php
skrivTjoflöjt();

function skrivTjoflöjt() {
    echo "Tjoflöjt!";
}
?>
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:

var skrivBuu = function() { echo "Buuu"; };

Om vi skriver

skrivBuu();

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.

Källor, referenser, bra länkar

www.php.net
w3schools.com/php/

Utvecklingsmiljöer

Labbservern

PHP 7.2, MariaDB 5.5 och Apache 2.4.6

Laragon

Apache 2.4, MySQL 5.7, PHP 7.4

Lösningsförslag

Alrik's