PHPs inbyggda funktioner

I denna lektionen går vi igenom hur man använder de funktioner som finns i PHP.

Alla fördefinierade funktioner i PHP finns listade i manualen. Det finns hundratals av dem, och som du säkert förstår kan man inte alla utantill. De funktioner man använder oftast brukar man kunna utantill efter ett tag, men fram tills dess får du gå in i manualen och kolla hur dem fungerar.

En funktion är en bit kod som körs då man anropar den. Syntaxen är väldigt enkel, man skriver bara funktionens namn följt av parenteser. Ett exempel är funktionen exit som ser till att ingen mer kod exekveras (körs) efter den anropats.

PHP - PHP: Hypertext Preprocessor
<?php // Skriv ut en paragraf (kommer skrivas ut) echo "<p>Paragraf 1.</p>"; // Anropa funktionen exit (ingen mer kod nedanför kommer exekveras) exit(); // Skriv ut en till paragraf (kommer INTE skrivas ut) echo "<p>Paragraf 2.</p>"; ?>
HTML - output
<p>Paragraf 1.</p>

Paragraf 1.

Funktionen exit kan vara väldigt användbar under tiden man utvecklar hemsidor (och inte minst felsöker dem), så lägg gärna den funktionen på minnet.

Testa funktionen själv med hjälp av filerna nedan (öppna exempelExitForm.html).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel Exit Formulär</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <p>Skriv in två texter i rutorna nedan.</p> <form action="exempelExit.php" method="get"> <input type="text" name="text1"><br> <input type="text" name="text2"><br> <input type="submit" value="Skicka"> </form> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <?php echo $_GET['text1']; exit(); // Notera, inget nedan körs, inte ens </body></html> skickas till webbläsaren! echo $_GET['text2']; ?> </body> </html>

Funktionen exit är lite speciell i den bemärkelsen att den inte returnerar någonting (utöver bemärkelsen att den slutar exekvera någon mer kod). I stort sett alla funktioner ger ett returvärde man kan använda sig av. Ett exempel är funktionen time, som returnerar aktuell timestamp. Timestamp är antalet sekunder som passerat sedan början på året 1970, och med hjälp av den kan man bland annat räkna ut dagens datum.

Självklart returnerar den här funktionen olika värden beroende på när man exekverar koden, så om du kör koden nedan kommer du få andra värden än vi fått. Vi har kört den här koden 2011-04-30 19:59:15.

PHP - PHP: Hypertext Preprocessor
<?php // Antalet sekunder sedan 1970-01-01 00:00:00 $sekunder = time(); echo '<p>Sedan början på första januari 1970 har det passerat '.$sekunder.' sekunder.</p>'; ?>
HTML - output
<p>Sedan början på första januari 1970 har det passerat 1304189955 sekunder.</p>

Sedan början på första januari 1970 har det passerat 1304189955 sekunder.

Testa funktionen time själv med hjälp av filen exempelTime.php (när du öppnat den med webbläsaren, testa att uppdatera sidan och se skillnaden).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <?php // Antalet sekunder sedan 1970-01-01 00:00:00 $sekunder = time(); echo '<p>Sedan början på första januari 1970 har det passerat '.$sekunder.' sekunder.</p>'; ?> </body> </html>

Funktioner kan du använda i uträkningar och i strängar på samma sätt som vanliga variabler. Man kan till exempel uppnå samma resultat som ovan utan att använda en variabel genom att anropa funktionen direkt i strängen.

PHP - PHP: Hypertext Preprocessor
<?php echo '<p>Sedan början på första januari 1970 har det passerat '.time().' sekunder.</p>'; ?>
HTML - output
<p>Sedan början på första januari 1970 har det passerat 1304189955 sekunder.</p>

Sedan början på första januari 1970 har det passerat 1304189955 sekunder.

De allra flesta funktioner vill att man skickar med ett argument när man anropar dem. Ett argument är en bit extra information som funktionen använder sig av för att bygga upp returvärdet, och den skickar man med mellan parenteserna när man anropar den.

Ett annat namn på argument är parameter. De båda orden har egentligen lite olika betydelser, men många känner inte till den och använder fel ord vid fel tillfälle, så i texter på andra sidor kanske de istället använder ordet parameter, men det är alltså i princip samma sak som avses. Skillnaden mellan de olika är att man använder namnet argument när man anropar funktionen, och ordet parameter när man definierar funktionen (lär dig mer om det i en kommande lektion).

För att visa ett exempel på en funktion som använder sig av ett argument kommer vi använda oss av funktionen strtoupper. Den gör om alla bokstäver i en sträng till versaler. Argumentet den tar emot är strängen vars bokstäver man vill göra till versaler, och returvärdet är strängen där alla bokstäver är versaler.

PHP - PHP: Hypertext Preprocessor
<?php $text = 'En liten textbit.'; // Skriv ut den vanliga texten (för att ha något att jämföra med) echo '<p>'.$text."</p>\n"; // Skriv ut texten igen, men nu i versaler echo '<p>'.strtoupper($text)."</p>"; ?>
HTML - output
<p>En liten textbit.</p> <p>EN LITEN TEXTBIT.</p>

En liten textbit.

EN LITEN TEXTBIT.

Testa funktionen själv med hjälp av filerna nedan (öppna exempelStrtoupperForm.html).

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel Strtoupper Formulär</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <p>Skriv in en text du vill ha i versaler nedan.</p> <form action="exempelStrtoupper.php" method="get"> <input type="text" name="text"><br> <input type="submit" value="Skicka"> </form> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <?php // Skriv ut texten exakt som besökaren skrev in den... echo '<p>'.$_GET['text'].'</p>'; // ...och i versaler echo '<p>'.strtoupper($_GET['text']).'</p>'; ?> </body> </html>

Argumentet som skickas in i en funktion måste inte vara en variabel, utan det kan även vara en sträng, ett heltal eller något annat.

Följande koder:

PHP - PHP: Hypertext Preprocessor
<?php $text = 'En liten textbit.'; echo '<p>'.strtoupper($text).'</p>'; ?>
PHP - PHP: Hypertext Preprocessor
<?php echo '<p>'.strtoupper('En liten textbit.').'</p>'; ?>
PHP - PHP: Hypertext Preprocessor
<?php $text = 'En liten textbit.'; $versalText = strtoupper($text); echo '<p>'.$versalText.'</p>'; ?>
PHP - PHP: Hypertext Preprocessor
<?php $ord1 = 'En'; $ord3 = 'textbit.' echo '<p>'.strtoupper($ord1.' liten '.$ord3).'</p>'; ?>
PHP - PHP: Hypertext Preprocessor
<?php echo '<p>'; echo strtoupper('En liten textbit.'); echo '</p>'; ?>

Resulterar alla i följande output:

HTML - output
<p>EN LITEN TEXTBIT.</p>

EN LITEN TEXTBIT.

En del funktioner tar emot fler än ett argument, och i dessa fall separerar man dem med kommatecknet.

Ett exempel på en funktion som kräver flera argument är funktionen explode. Den funktionen delar upp en sträng i olika delar och skickar tillbaka en array. Det första argumentet är en sträng som talar om vid vilken textbit strängen ska splittras, och det andra argumentet är strängen som ska splittras.

PHP - PHP: Hypertext Preprocessor
<?php $text = "Detta är lite text."; // Dela upp vid mellanslag-tecknet $ord = explode(" ", $text); // $ord är nu en array identisk med denna: $array = array( 0 => "Detta", 1 => "är", 2 => "lite", 3 => "text." ); ?>

Om man vill veta vad en variabel innehåller kan man använda sig av funktionen print_r eller var_dump. Dessa funktioner använder man enbart i utvecklingssyfte, för det är ingen mening med att låta besökaren se hur några variabler som finns på sidan ser ut, och de returnerar inte någonting, utan de skickar texten direkt till webbläsaren. Skillnaden mellan de båda funktionerna är att var_dump visar mer information om variabeln, men nedanför nöjer vi oss med den information print_r förser oss med.

PHP - PHP: Hypertext Preprocessor
<?php $text = "Detta är lite text."; // Dela upp vid mellanslag-tecknet $ord = explode(" ", $text); // Visa oss hur $ord ser ut print_r($ord); ?>
HTML - output
Array ( [0] => Detta [1] => är [2] => lite [3] => text. )
Array ( [0] => Detta [1] => är [2] => lite [3] => text. )

Som du ser ser man enkelt hur variabeln ser ut om man kollar i källkoden, men i och med att det inte finns några <br>-taggar så visas all kod på en rad då man ser sidan i webbläsaren. Om vi även vill se radbrytningar då man besöker sidan kan vi använda oss av taggen <pre>, som visar radbrytningar som radbrytningar.

PHP - PHP: Hypertext Preprocessor
<?php $text = "Detta är lite text."; // Dela upp vid mellanslag-tecknet $ord = explode(" ", $text); // Visa oss hur $ord ser ut echo "<pre>"; print_r($ord); echo "</pre>"; ?>
HTML - output
<pre>Array ( [0] => Detta [1] => är [2] => lite [3] => text. ) </pre>
Array
(
    [0] => Detta
    [1] => är
    [2] => lite
    [3] => text.
)

Nu kan vi direkt i webbläsaren enklare se hur en array ser ut, istället för att gå in i källkoden och kolla.

Testa själv med filerna nedan.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel Explode Formulär</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <p>Skriv in en text i rutorna nedan.</p> <form action="exempelExplode.php" method="get"> <input type="text" name="text"><br> <input type="submit" value="Skicka"> </form> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Exempel</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <?php $ord = explode(' ', $_GET['text']); echo '<pre>'; print_r($ord); echo '</pre>'; ?> </body> </html>

Funktionerna print_r och var_dump är väldigt användbara när man utvecklar en hemsida och felsöker den, så lägg gärna dessa funktioner på minnet!

En annan bra funktion att kunna är implode, som lägger ihop alla värden i en array till en sträng. Den första parametern är en textbit som ska finnas emellan alla värden i arrayen som anges i den andra parametern.

PHP - PHP: Hypertext Preprocessor
<?php $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); echo implode('-', $minaKompisar); ?>
HTML - output
Pelle-Lisa-Per-Angela
Pelle-Lisa-Per-Angela

I manualen finns det exempel på hur man använder alla inbyggda funktioner i PHP. Som nybörjare har man vanligtvis svårt för att förstå texten de skriver som förklarar hur en funktion fungerar, men om man istället bläddrar ner och kollar på exemplen brukar det klarna. Gå in i manualen för implode och se själv!

I lektionen om arrayer skrev vi ut alla värden i $minaKompisar i en lista i HTML med hjälp av loopen foreach på följande sätt:

PHP - PHP: Hypertext Preprocessor
<?php $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); echo "<ul>\n"; foreach($minaKompisar as $namn){ echo "\t<li>".$namn."</li>\n"; } echo "</ul>"; ?>
HTML - output
<ul> <li>Pelle</li> <li>Lisa</li> <li>Per</li> <li>Angela</li> </ul>
  • Pelle
  • Lisa
  • Per
  • Angela

Detta kan vi faktiskt åstadkomma utan att använda loopen foreach, och istället använda funktionen implode.

PHP - PHP: Hypertext Preprocessor
<?php $minaKompisar = array( "Pelle", "Lisa", "Per", "Angela" ); echo "<ul> <li>".implode("</li>\n\t<li>", $minaKompisar)."</li> </ul>"; ?>
HTML - output
<ul> <li>Pelle</li> <li>Lisa</li> <li>Per</li> <li>Angela</li> </ul>
  • Pelle
  • Lisa
  • Per
  • Angela

Som du ser kan samma resultat uppnås på flera olika sätt, men hur vet man vilket sätt man bör välja? Den frågan ska du som nybörjare inte bry dig om, utan kör på det sättet du tycker är enklast. Att bestämma vilket sätt som är bäst har inget uppenbart svar, för olika lösningar har olika fördelar.

Det återstår många funktioner i PHP att upptäcka för dig, men tyvärr kan vi inte lära dig alla här. Vi kommer dock lära dig de mest använda funktionerna under lektionernas gång, så även om du inte känner till många funktioner än kan du med gott samvete gå vidare till nästa lektion - denna lektionens uppgift var att lära dig hur man använder dem, inte vilka som finns.

En mycket speciell, men väldigt användbar, funktion är session_start. Med hjälp av den kan PHP komma ihåg information för en besökare mellan olika sidladdningar. I vanliga fall försvinner ju variablers värden när en PHP-fil har exekverats, och nästa gång samma PHP-fil exekveras måste variablerna börja om med att få värden tilldelade till sig, men med session_start kan man alltså få variabler att återuppta de värden de hade föregående sidladdning.

Anta till exempel att man vill ha koll på hur många gånger en viss besökare har besökt en sida på sin hemsida. Om vi inte visste om att session_start fanns skulle ett tappert försök vara något i stil med detta:

PHP - sida1.php
<?php // Variabel som håller koll på hur många gånger en besökare har besökt sidan $antalSidladdningar = 1; // Gå till en sida som ökar $antalBesök echo '<p>Välkommen till min hemsida, du har nu besökt den '.$antalSidladdningar.' gång. Gå vidare till <a hrer="sida2.php">nästa sida</a>.</p>'; ?>
PHP - sida2.php
<?php // Öka antalet sidladdningar med 1 $antalSidladdningar++; // Visa antalet besök echo '<p>Du har nu besökt sidan '.$antalSidladdningar.' gånger. <a href="sida2.php">Besök den igen</a>!</p>'; ?>

Om man till exempel först går in på sida1.php, sedan går till sida2.php och avslutningsvis går in på sida2.php en gång till är alltså tanken att besökaren ska se följande:

Välkommen till min hemsida, du har nu besökt den 1 gång. Gå vidare till nästa sida.

Du har nu besökt sidan 2 gånger. Besök den igen!

Du har nu besökt sidan 3 gånger. Besök den igen!

Idén är god, men den fungerar inte. När vi besöker sida2.php har inte variabeln $antalSidladdningar tilldelats det värde den hade i slutet av sida1.php, för variabler och deras värden försvinner så fort PHP är klar med att exekvera en PHP-fil. Men om vi i början av filen anropar funktionen session_start kan man alltså få PHP att komma ihåg en del variablers värden mellan olika sidladdningar. session_start återskapar variabeln $_SESSION (som är en array) precis som den såg ut i slutet av förra sidladdningen, så vi kan lägga in värden i den för att spara undan dem till nästa sidladdning.

Följande kod skulle alltså åstadkomma det vi är ute efter.

PHP - sida1.php
<?php // Anropa session_start så att vi har tillgång till $_SESSION session_start(); // Spara antalet sidladdningar i $_SESSION istället $_SESSION['antalSidladdningar'] = 1; // Gå till en sida som ökar $antalBesök echo '<p>Välkommen till min hemsida, du har nu besökt den '.$_SESSION['antalSidladdningar'].' gång. Gå vidare till <a hrer="sida2.php">nästa sida</a>.</p>'; ?>
PHP - sida2.php
<?php // Anropa session_start så att vi har tillgång till $_SESSION session_start(); // Öka antalet sidladdningar med 1 $_SESSION['antalSidladdningar']++; // Visa antalet besök echo '<p>Du har nu besökt sidan '.$_SESSION['antalSidladdningar'].' gånger. <a href="sida2.php">Besök den igen</a>!</p>'; ?>

Avslutningsvis visar vi ett par exempel där vi låter besökaren fylla i sitt förnamn i ett textfält i ett formulär och sedan visa information om namnet på PHP-sidan formuläret skickas till.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Skicka formulär</title> </head> <body> <form method="get" action="taEmot.php"> Fyll i ditt namn: <input type="text" name="namnet"><br> <input type="submit" value="Skicka"> </form> </body> </html>
Fyll i ditt namn:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Information om ditt namn</title> </head> <body> <?php // Trim tar bort eventuella mellanslag i början och slutet på angiven sträng $namn = trim($_GET['ifylltNamn']); // Namnet som besökaren skrev in det echo '<p>Ditt namn är '.$namn.".</p>\n"; // Namnet i versaler (STORA BOKSTÄVER) echo '<p>Ditt namn i versaler är '.strtoupper($namn).".</p>\n"; // Namnet i gemener (små bokstäver) echo '<p>Ditt namn i gemener är '.strtolower($namn).".</p>\n"; // Namnet börjar på versal, resten gemener echo '<p>Ditt "Namn" är '.ucfirst(strtolower($namn)).".</p>\n"; // Antal tecken i namnet echo '<p>Ditt namn är '.strlen($namn)." tecken långt.</p>\n"; ?> </body> </html>

Funktionen trim på rad 10 kan verka onödig (vem fyller i mellanslag före eller efter sitt namn?), men det är bra att använda den. När vi använt den funktionen kan vi vara säkra på att namnet inte är konstigt angett (att besökaren av misstag råkat trycka på mellanslag i början eller i slutet av namnet), och vi kan vara säkra på att funktionen strlen (string length) returnerar rätt längd på namnet (om det skulle inletts eller slutat med mellanslag skulle strlen räknat dessa som tecken). Funktionerna strtoupper (string to uppercase) och strtolower (string to lowercase) gör om namnet till versaler respektive gemener, och ucfirst (uppercase first) gör om första tecknet i strängen till versal. På rad 22 skickar vi alltså först in namnet till funktionen strtolower som returnerar namnet i gemener. Det returvärdet skickar vi sedan direkt in i funktionen ucfirst som returnerar namnet med första bokstaven som versal.

Om besökaren anger sitt namn som "PEpPe" skulle alltså följande output erhållas:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Information om ditt namn</title> </head> <body> <p>Ditt namn är PEpPe.</p> <p>Ditt namn i versaler är PEPPE.</p> <p>Ditt namn i gemener är peppe.</p> <p>Ditt "Namn" är Peppe.</p> <p>Ditt namn är 5 tecken långt.</p> </body> </html>

Ditt namn är PEpPe.

Ditt namn i versaler är PEPPE.

Ditt namn i gemener är peppe.

Ditt "Namn" är Peppe.

Ditt namn är 5 tecken långt.

I exemplet ovan utgick vi från att förnamnet var ett enkelnamn, det vill säga att det ifyllda namnet inte bestod av två namn åtskilda med ett bindestreck i stil med "Karl-Johan" eller "Gun-Britt". Nedan bygger vi ut föregående exempel så att den även visar information om dubbelnamn.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Information om ditt namn</title> </head> <body> <?php // Samma som förra början... $namn = trim($_GET['ifylltNamn']); echo '<p>Ditt namn är '.$namn.".</p>\n"; echo '<p>Ditt namn i versaler är '.strtoupper($namn).".</p>\n"; echo '<p>Ditt namn i gemener är '.strtolower($namn).".</p>\n"; // ...tills hit, här börjar det nya! // $namndelar är en array med alla delnamn som element $namndelar = explode('-', $namn); // count räknar antal element i en array echo '<p>Ditt namn är uppbyggt av '.count($namndelar)." delnamn.</p>\n"; // Skriv ut alla delnamn i en lista echo "<ul>\n"; foreach($namndelar as $index => $delnamn){ echo '<li>'.($index+1).': '.$delnamn."</li>\n"; } echo "</ul>\n"; // Gör första bokstaven i delnamnen till versal, resten gemener foreach($namndelar as $index => $delnamn){ $namndelar[$index] = ucfirst(strtolower($delnamn)); } // implode sätter ihop alla namndelar till en sträng avskilda med angiven avgränsare echo '<p>Ditt "Namn" är '.implode($namndelar, '-').".</p>\n"; // Räkna antalet tecken som finns i namnet echo '<p>Ditt namn är '.strlen($namn)." tecken långt.</p>\n"; // Räkna antalet tecken som finns i namnet utan bindestreck echo '<p>Ditt namn är '.(strlen($namn) - count($namndelar) + 1)." tecken långt (utan bindestreck).</p>\n"; // Ett annat sätt att åstadkomma senaste uträkningen på $antalTecken = 0; foreach($namndelar as $index => $delnamn){ $antalTecken += strlen($delnamn); } echo '<p>Ditt namn är '.$antalTecken.' tecken långt (utan bindestreck).</p>'; ?> </body> </html>

Om man till exempel fyller i namnet "Sven-Ingvar" skulle följande output erhållas:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Information om ditt namn</title> </head> <body> <p>Ditt namn är SvEn-inGVAr.</p> <p>Ditt namn i versaler är SVEN-INGVAR.</p> <p>Ditt namn i gemener är sven-ingvar.</p> <p>Ditt namn är uppbyggt av 2 delnamn.</p> <ul> <li>1: SvEn</li> <li>2: inGVAr</li> </ul> <p>Ditt "Namn" är Sven-Ingvar.</p> <p>Ditt namn är 11 tecken långt.</p> <p>Ditt namn är 10 tecken långt (utan bindestreck).</p> <p>Ditt namn är 10 tecken långt (utan bindestreck).</p> </body> </html>

Ditt namn är SvEn-inGVAr.

Ditt namn i versaler är SVEN-INGVAR.

Ditt namn i gemener är sven-ingvar.

Ditt namn är uppbyggt av 2 delnamn.

  • 1: SvEn
  • 2: inGVAr

Ditt "Namn" är Sven-Ingvar.

Ditt namn är 11 tecken långt.

Ditt namn är 10 tecken långt (utan bindestreck).

Ditt namn är 10 tecken långt (utan bindestreck).

Förstår du hur koden ovan fungerar? Det är längsta exemplet hittills bland lektionerna i PHP, men låt inte kodstorleken avskräcka dig. Vi använder bara sådant du lärt dig i lektionerna hittills (ok, en del funktioner är nya, men du vet hur man använder dem), så om du ger det tid och tänker efter så förstår du nog hur varje rad i koden fungerar. Sedan kan man ställa sig frågan vad som händer om besökaren anger att denne heter "" (det vill säga, besökaren fyller inte i något i textfältet utan skickar bara iväg formuläret) eller "Karl-Erik-Johan" (trippelnamn). Hur blir outputen då? Fungerar ens PHP-koden? Försök lista ut svaret i förväg, testkör sedan och se vad som händer!

Gå till nästa lektion, Villkorssatser.