2. Moment02 - PHP grunder

Det har blivit dags att lära sig grunderna i PHP. Eftersom denna kurs har Programmering01 som förkunskapskrav så kommer jag inte gå så djupt i att lära dig att programmera utan istället visa hur dina koder skrivs i PHP.

I varje del så kommer det finnas lite kort text om saker att tänka på, kodexempel, ibland länkar eller filmklipp och slutligen en eller flera uppgifter där du får träna på att skriva kod. Tanken med detta moment är att du löser uppgifter för att du själv skall bygga en egen referensbank mer än att du löser uppgifter för inlämning.

Tip

Du tar ansvar för att jobba med de delar som du själv känner att du behöver arbeta med. Din kompis kanske har bättre förkunskaper och lär sig PHP snabbare än du.

2.1 PHP & HTML

PHP är ett scriptspråk som bäddas in i html-kod för att skapa dynamiska hemsidor.
Namnet PHP är en rekursiv akronym: Hypertext Preprocessor.

Det finns alternativa tekniker för att skapa dynamiska hemsidor;

  • ASP – Microsofts scriptspråk (bygger på Jscript eller Vbscript).
  • JSP – ett scriptspråk byggt på java, ej att förväxlas med Javascript
  • CGI – ett scriptspråk som mest användes i internets barndom (Perl/C++)

Motsatsen till PHP är statiska sidor tex HTML.

2.1.1 Webbservern

En kort film som visar på hur webbservern bearbetar en fil med php-skript.

Den webbserver som vi använder i denna kurs är XAMPP, har du inte redan installerat och konfigurerat den så är det hög tid./p>

2.1.2 Hur PHP och HTML samarbetar

PHP är som du förstått ett scriptspråk som med olika avancerade koder gör saker på en server, resultatet som användaren ser blir dock alltid html-kod. Detta gör att vi säger att php är inbäddat i html. För att klara av denna kursen på ett bra sätt så behöver du alltså vara duktig både på att programmera php men du behöver också kunna html och css, annars kommer det arbete du gör inte se bra ut.

Kodexempel

<!DOCTYPE html>
<html lang="sv">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <?php
    echo "Detta är skrivet inne i kodtaggen";
  ?>
</body>
</html>

För att infoga php i htmlkod så skapar du en kodtagg, se rad 8-10 i exemplet. När du kör skriptet i webbläsaren via XAMPP så kommer utskriften se ut så här.

Utskrift

Detta är skrivet inne i kodtaggen

Testa nu att kopiera koden ovan, döp filen till test.php och kör den i webbläsaren genom XAMPP's webbrot. Funkar det inte eller om du inte vet hur du gör så kika i kunskapsdokumentet: XAMPP

2.2 Utskrift

Nyckelordet för att skriva ut saker i php, alltså göra om kod till något som blir html-kod, är echo. Print fungerar på liknande sätt. Orsaken till att bägge fungerar är att PHP är tänkt att vara ett smidigt språk för alla programmerare oavsett från vilken miljö du kommer. Detta är både en fördel och en nackdel. Vill du grotta ner lite extra i skillnader mellan echo och print så sök på php.net.

Kodexempel

<!DOCTYPE html>
<html lang="sv">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <?php
  echo "<h1>Rubrik med echo</h1>";
  print "<h2>Rubrik med print</h2>";
  ?>
</body>
</html>

Uppgift

Skapa ett php-dokument som du löser alla detta moments uppgifter i. Tanken är att om du kommenterar de olika delarna på ett bra sätt så skapar du ett eget referensdokument med mängder av kodexempel som du kan använda dig av senare.

  1. Skriv ut en rubrik (använd HTML-koder) som talar om att du i denna del jobbar med echo.
  2. Skriv ut ditt namn och någonting annat över två rader. Även här behöver du använda html-koder.

2.3 Kommentarer

Det är viktigt att kommentera den kod du skriver och det av flera olika anledningar. Nu i början så är det bra att kommentera för att sätta ord på det du har skapat, senare så är det bra att kommentera för att förstå större programmeringsflöden, framförallt om det var länge sedan du skapade koden. Det är också skönt att ha välkommenterad kod om du skall använda någon annans kod.

Kodexempel

<!DOCTYPE html>
<html lang="sv">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <!-- kommentar i html-koden kommer inte skrivas ut i webbläsaren
      men den kommer synas i källkoden! -->
  <?php
  // När vi kommenterar i php så använder vi dubbla "slashtecken"
  #  eller ett hashtecken.
  echo "<p>Att kommentera koden är viktigt.</p>";

  /*
  * Vill vi skriva en kommentar över flera rader
  * så skriver vi på detta sätt.
  * De viktigaste tecknen är starten på rad 15 och
  * slut på rad 21, de andra stjärnorna "*" kan tas bort,
  * de används bara för att det skall se snyggare ut.
  */
  print "<h2>Rubrik med print</h2>";
  ?>
</body>
</html>

Uppgift

Här finns ingen specifik uppgift men från och med nu vill jag att du kommenterar de delar som du lär dig eller testar på i varje uppgift. Tränar du på loopar så är det loopen du kommenterar. När vi senare tittar på metoder kommer du få mer tips på effektiva kommentarer.

2.4 Datatyper

Datatyper är en viktig sak inom programmeringen. Alla variabler (och konstanter) som programmet skall hålla reda på har en datatyp. Det är datatypen som avgör vad man kan göra med just den typen av variabel. Det går att räkna med tal men inte med strängar osv.

För användaren verkar det som att PHP inte använder datatyper men skillanden mot de flesta andra språk är att PHP själv håller koll på vilken datatyp en viss variabel har. Om vi jämför med Java, C++ eller C# så talar vi om vid skapandet att en specifik variabel har en specifik datatyp och sedan kan det inte ändras när programmet körs. I PHP så har en viss variabel en bestämd datatyp vid ett enskilt tillfälle men den kan ändra datatyp lite senare. PHP-tolken tar själv hand om vilken datatyp som är lagrad i variabeln.
Det stora problemet uppstår för oss som användare som också måste hålla koll på vilken datatyp som finns lagrad i variabeln. Beroende på vad vi vill använda variabeln till så behöver vi ibland kolla att den har rätt datatyp, annars kommer applikationen inte att göra som vi förväntar oss.

De datatyper som finns i PHP är;

  • boolean, bool - kan har värdet sant eller falskt, blir resultatet i uttryck.
  • integer, int - lagrar heltal.
  • float, double, real - lagrar decimaltal, (i php är dessa tre samma sak, i andra språk skiljer det en del).
  • string - lagar textsträngar (egentligen en sekvens av bokstäver).
  • array - en samling av värden (vi återkommer till den senare).
  • objekt - en datatyp som representerar en grupp av variabler som på något sätt hänger ihop.
  • NULL - en variabel som inte har något värde alls, två variabler med värdet NULL är inte lika.
  • resource - variabeln innehåller en referens till någonting, tex ett databasanrop eller en fil.

Vill du läsa mer och se exempel på de olika datatyperna så finns det bra info här w3schools - datatyper.

Några av datatyperna har du redan använt och de flesta andra kommer du stöta på under kursen.
Viktigt är dock att trots att PHP inte skriver ut vilken datatyp en viss variabel har så behöver du ha koll på vad variabeln innehåller för att du skall kunna använda den på rätt sätt.

2.5 Variabler

En variabel kan ses som en behållare som innehåller någonting. I namnet variabel känner du nog också att innehållet i denna variabel kan variera, alltså bytas ut.

För att jobba med variabler i PHP så finns det några saker du behöver känna till;

  • En variabel måste ha ett namn, vi kan använda alla siffror och bokstäver, undvik dock å/ä/ö, samt en del specialtecken för att döpa en variabel.
    OBS1: Namnet får inte börja med en siffra.
    OBS2: Mellanslag får inte användas i en variabel.
  • Vi talar om att en variabel är en variabel genom att den framför namnet har ett dollartecken ($).
  • Eftersom du själv får döpa en variabel så använd beskrivande namn, $summa, $radie och $skatt är mycket mer beskrivande än $a, $b, $x och $tal12.
  • God programmeringssed här innebär att vi använder gemener (små bokstäver) för att namnge variabler. Väljer vi att skapa längre variabelnamn som är sammansatta av flera ord så använder vi camelCase ($namnPaLangVariabel) eller använder oss av underscore ($namn_pa_lang_variabel), ingen är mer rätt än den andra men försök att vara konsekventa så att du inte blandar i din kod.

Kodexempel

<!DOCTYPE html>
<html lang="sv">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <?php
    // varibeln $skola skapas och tilldelas texten "Alströmergymnasiet"
    $skola = "Alströmergymnasiet";

    // Skriv ut att kursen går på vilken skola
    echo "Denna kursen läser vi på " . $skola;

    // Skapar två variabler
    $hojden = 3;
    $bredden = 4;

    // Skriv ut arean
    echo "<p>Arean på rektangeln är ".$hojden*$bredden."</p>";

    // Vi kan också beräkna arean först
    $arean = $hojden*$bredden;

    // Skriv ut arean igen, denna gången med variabeln $area
    echo "<p>Arean på rektangeln är $arean.</p>";
  ?>
</body>
</html>

Uppgift

  1. Skapa två variabler där du i den ena lagrar ditt namn och i den andra denna kursens namn. Gör sedan en utskrift om att Johan läser kursen Webbserverprogrammering 1
  2. Skapa en variabel $radie som får värdet 4, beräkna sedan area och omkrets av en cirkel. Anta att PI har värdet 3.14.
    Utskriften kan se ut så här; Om radien är 4 så är omkretsen 25.12 och arean 50.24.

2.6 Konkatenering

Vi har redan varit inne på hur vi kan slå ihop olika strängar/texter med variabler och direkta uträkningar. Detta är en extremt viktig del av PHP att vi har koll på detta. Du kommer också märka att det går att göra på så många olika sätt, i denna kursern kommer vi göra på något av två sätt och i slutet av kursen men framförallt i nästa kurs kommer vi titta på ett helt annat sätt att strukturera upp texten på.
Kika på kodexemplet, där finns olika exempel med förklaringar.

Kodexempel

Ingen utskrift finns på dessa koder men jag skriver ut i koden vad som händer, det är också enkelt att kopiera all kod och köra den på din egen dator.

<?php
//  Nu tog jag bort html-koden för att ni har sett den flera gånger och det
//  fungerar faktiskt att köra php utan html men det blir ju svårt att
//  formattera på ett snyggt sätt.

  // Vi börjar med en variabel
  $skola = "Alströmergymnasiet";

  // Konkateneringspunkten som bygger ihop strängen/variabeln på höger
  // och vänster sida om punkten.
  echo "<p>Johan jobbar som lärare på " . $skola."</p>";

  // Detta ger utskriften
  // Johan jobbar som lärare på Thoren Innovation School

  // Om vi struntar i punkten och lägger in variabeln i strängen
  echo "<p>Johan jobbar som lärare på $skola</p>";

  // Det ger ju också utskriften
  // Johan jobbar som lärare på Thoren Innovation School

  // Hur funkar det med enkelfnutt istället?
  echo '<p>Johan jobbar som lärare på $skola</p>';

  // Det ger utskriften
  // Johan jobbar som lärare på $skola
  // Enkelfnutt, ', skriver alltså ut namnet på variabeln.

  // Vi räknar lite addition
  $tal1 = 3; $tal2 = 4;   // Vi kan ge flera instruktioner på samma rad

  // Vi skriver ut...
  echo "<p>$tal1 + $tal2 = $tal1+$tal2</p>";
  // och får svaret 3 + 4 = 3+4, det är ju inte det svar vi vill ha

  // Vi testar att bryta isär och konkatenera med punkt
  echo "<p>$tal1 + $tal2 = " . $tal1+$tal2."</p>";
  // Då blir svaret 4, det är ju inte rätt

  // Vi testar med parenteser för att se om vi kan tvinga fram rätt resultat
  echo "<p>$tal1 + $tal2 = " .($tal1+$tal2)."</p>";
  // Resultatet blir då "3 + 4 = 7", skönt

  // Kan vi gå tillbaka till första utskriften då och bara lägga till ()?
  echo "<p>$tal1 + $tal2 = ($tal1+$tal2)</p>";
  //  Det gick inte, då blir resultatet "3 + 4 = (3+4)", här kommer det ologiska
  //  med PHP fram. Det är klart att det går att förklara varför det blir som det
  //  blir. Men jag kan inte förklara det. Enda sättet att lära sig hantera detta
  //  är att testa egna lösningar och inte ge sig förrän problemet är löst.

  // Ett säkert sätt som alltid fungerar är att dela upp i olika satser,
  // PHP jobbar aldrig med flera satser samtidigt så detta kommer fungera
  echo "<p>$tal1 + $tal2 = ";
  echo $tal1+$tal2."</p>";
  // Fast det är ju egentligen samma sak som det vi skrev på rad 41, men uppdelat
?>

Uppgift

  1. Vi återanvänder en gammal uppgift, gå tillbaka till uppgift 4, den som beräknade area och omkrets av en cirkel. Denna uppgift skall vi nu göra på två sätt;
    1. Det första sättet då skall alla uträkningar göras i samband med att svaret skrivs ut. Här måste du använda konkatenering.
    2. I den andra lösningen får du använda variablerna $area och $omkrets och seda skapa en utskrift utan konkatenering.
    Fundera sedan på vilket sätt du föredrar, bägge är helt ok att använda sig av.

2.6 Strängar

Strängar både skiljer sig och liknar tidigare variabler som vi har använt. Det går ju inte att räkna med dem men vi kommer använda dem väldigt ofta för att bygga upp längre strängar som sedan skrivs ut.

Kodexempel

<?php
  // Exempel på hur vi kan jobba med strängar
  $str = "En liten";

  // Här låter vi den ursprungliga strängen konkatenera med den nya strängen
  $str = $str . " sträng.";
  echo $str;
  // Utskriften blir i detta fallet "En liten sträng."

  // Vi kan också skriva det på följande sätt
  $str = "En liten";
  $str .= " sträng";
  // $str .= fungerar som "$str = $str ."
?>

2.6.1 Escapetecken

När vi jobbar med strängar så används tecknet " för att öppna och stänga en sträng. Om vi vill skriva ut ett sådant tecken så kommer vi få problem då PHP-tolken kommer läsa våra instruktioner felaktigt. Det finns ett sätt att gå runt detta och det gör vi med ett så kallat escapetecken (\) som gör att vi talar om för PHP-tolken att detta tecken behöver du inte tolka utan bara skriv ut det.

Kodexempel

<?php
  // escapetecken "\" gör att vi kan skriva ut tecknet "
  echo "Peter \"Foppa\" Forsberg";

  // Andra tillfällen då vi behöver använda escaptecken är när vi vill skriva ut
  echo "\'";      // ' - enkelfnutt

  echo "\\";      // / - backslash

  echo "\$";      // $ - dollartecken,

  echo "\n";      // \n - ger radbrytning i html-koden men inte på sidan.

  echo "\t";      // \t - ger tab i html-koden men inte på sidan.

  // beroende på om vi omringar strängen med enkel- eller dubbelfnutt
  // så behöver vi köra escapetecken på samma tecken inne i strängen.
?>

Att hantera escapetecken är inte helt enkelt eller speciellt naturligt så det behöver du troligtvis träna på.

Uppgift

  1. Skriv ut följande text;
    - Jag tycker det är ”kul” med PHP!
    - Nej, jag skojade bara!
    (dubbelfnutt (”) och radbrytning skall du göra med escapetecken. Radbrytningen skall både synas på sidan och i källkoden)

2.6.2 Strängfunktioner

Någonting som är väldigt användbart i PHP är den mängd av stringsfunktioner som finns tillhands. Att manipulera strängar är något du kommer behöva lära dig. Jag skall nu visa några av de som du har stört behov av att använda.

I exemplen nedan kommer det ibland finnas en alternativ funktion med prefixet mb_ vilket står för multibyte och dessa funktioner är särskilt anpassade för svenska tecken som å, ä och ö.

trim()

Det finns flera användningsområden, men den vanliga är att ta bort whitespace (mellanslag och tab) i början och slutet av en sträng. Användbart när vi får data från ett formulär.

$str = "  Steve Jobs   ";
$str = trim($str);   // Lagras som "Steve Jobs"
  

strlen() || mb_strlen()

Räknar antalet tecken i strängen.

echo strlen($str);   // Skriver ut 10 ("Steve Jobs")

strtoupper() || mb_strtoupper()

Gör om strängen till enbart versaler.

echo strtoupper($str);   // Skriver ut "STEVE JOBS"

strtolower() || mb_strtolower()

Gör om strängen till enbart gemener.

echo strtolower($str);   // Skriver ut "steve jobs"

strrev() || ingen mb_strrev, men funktion finns här.

Vänder på strängen, extremt användbart!

echo strrev($str);   // Skriver ut "sboJ evetS"

ucfirst() || ingen mb_ucfirst, men funktioner finns att hitta vid sökning

Gör första bokstaven i strängen versal. Visar här med att första göra hela strängen till gemena bokstäver för att sedan göra första bokstaven versal. OBS! När det är flera funktioner i varandra så börjar vi längst in i den innersta parentesen.

echo ucfirst(strtolower($str));   // Skriver ut "Steve jobs"

ucwords() || mb_convert_case

På samma sätt som ovan så använder jag ucwords vilket gör första bokstaven i varje ord versal.

echo ucwords(strtolower($str));   // Skriver ut "Steve Jobs"

stripos() || mb_stripos()

Kollar om det du söker efter finns i strängen.

echo stripos($str, "Steve");   // Skriver ut "0" då Steve börjar på position 0.

str_replace()

Byter ut en del av strängen mot något annat.

echo str_replace("Steve", "Kalle", $str);   // Skriver ut "Kalle Jobs"

Det finns många bra funktioner som vi kommer använda vid olika tillfällen. Det viktigaste är att vi vet hur principen är att använda dem och också var vi hittar instruktionerna om hur de används. En bra sammanställning med tydliga exempel. Eller så går vi direkt till php.net och manualen för strängfunktioner.

Uppgift

  1. Skapa en variabel med innehållet ”WebbServerProgrammering 1”, du skall nu med olika strängfunktioner få fram, och skriva ut, olika strängar.
    1. 25 (längden på strängen)
    2. webbserverprogrammering 1 (bara gemener)
    3. WEBBSERVERPROGRAMMERING 1 (bara versaler)
    4. 1 gniremmargorprevresbbeW (första bokstaven stor, omvänd utskrift)
    5. Testa att ändra innehållet i strängen, använd en sträng som innehåller å, ä och/eller ö inne i strängen och inte först i strängen. Kontrollera att det fungerar som det skall, annars behöver du kika på multibytefunktionerna, alltså de som börjar med mb_.

2.7 Arrayer

Array är en datatyp som är väldigt användbar inom programmering och någonting som du kommer använda ofta i php framförallt när vi senare jobbar med databaser. En array är en variabel som består av flera olika värden, du kan likställa den med en låda som har flera olika fack. I varje fack finns sedan ett innehåll som du kan använda dig av.
Tänk dig att en klass med 25 elever har haft ett prov och du skall sammanställa resultatet för alla 25 elever. Istället för att skapa 25 unika variabler, $resultat1, $resultat2 osv så skapar du en array med 25 komponenter, varje fack kallas för en komponent.
I PHP, till skillnad från flera andra programmeringsspråk, behöver du inte tala om när du skapar arrayen hur många komponenter som den skall innehålla och du kan också lägga till och ta bort komponenter efter att arrayen är skapad.

2.7.1 Ge värde

Det finns olika sätt att ge arrayens komponenter olika värden. Jag ger ett kodexempel.

Kodexempel

<?php
// När vi skapar en ny array kan vi ge den flera värden.
$resultat = array(12, 14, 15);

// När vi sedan vill lägga till flera värden måste vi skriva så här.
// Det går att skapa arrayen och ge den värden på detta sättet direkt.
$resultat[] = 16;

// Skriver ut alla värden i arrayen
echo "<pre>";
var_dump($resultat);
echo "</pre>";
?>

Utskrift

array(4) {
  [0]=>
  int(12)
  [1]=>
  int(14)
  [2]=>
  int(15)
  [3]=>
  int(16)
}

2.7.2 Index

Som du säkert noterar ovan så får varje komponent ett index. Anger du inget index så kommer de automatiskt att räknas från 0 och uppåt. Att numrera från 0 är klassiskt inom programmeringen. Det går att skapa egna index om du vill, kanske används det för att göra en koppling till exempelvis riktnr.

Kodexempel

<?php
// Här väljer jag att skriva index och värde på en rad, det går att
// skriva på samma sätt som tidigare men detta blir mer lättläst.
$riktnr = array(
   "031" => "Göteborg",
   "040" => "Malmö",
   "07XX" => "Mobil",
   "08" => "Stockholm"
 );

// Skriver ut alla värden i arrayen
echo "<pre>";
var_export($riktnr);      // var_export ger annan formattering
echo "</pre>";

Utskrift

array (
  '031' => 'Göteborg',
  '040' => 'Malmö',
  '07XX' => 'Mobil',
  '08' => 'Stockholm',
)

2.7.3 Använda en komponents innehåll

Att använda en array är i stort sett som att använda vilken variabel som helst, den enda skillnaden är att du måste tala om namnet på arrayvariabeln och den komponents index som du vill använda.

Kodexempel

<?php
$resultat = array(11, 12, 13, 14);

// Ändra innehållet i den fjärde komponenten, index 3.
$resultat[3] = 15;

// Skriver ut alla värden i arrayen
echo "<pre>";
var_export($resultat);
echo "</pre>";

// Skriver ut innehållet i den fjärde komponenten
echo "<p>$resultat[3]</p>";
?>

Utskrift

array (
  0 => 11,
  1 => 12,
  2 => 13,
  3 => 15,
)
15

2.7.4 Resurser & länkar

Webbguider på svenska, Arrayer

Uppgift

  1. Skapa två arrayer med minst tre komponenter, i den ena lagrar du förnamn och i den andra lagrar du mailadresser. Se till att det finns lika många namn som mailadresser.
    Skriv sedan ut bägge arrayerna med hjälp av metoderna var_dump() eller var_export().
    Avsluta med att skriva ut en text som liknar "Anders har mailadressen info@anders.se" genom att skriva ut innehållet från bägge arrayerna med samma index.

2.8 Selektioner

I alla programmeringsspråk så är selektioner ett centralt begrepp. Selektioner eller villkorssatser brukar vi kalla det på svenska, Control Structures heter det på engelska.

Oavsett vad det kallas så handlar det om val och att tala om för programmet att göra olika saker beroende på ett specifikt villkor. Vi kommer gå igenom två olika strukturer som i grunden fungerar på samma sätt, fastän de skrivs olika.

2.8.1 If-satsen

Den absolut vanligaste selektionen är att bara använda en if-sats. Genom att skriva en if-sats och i parentesen ha ett uttryck så får du din kod att utföra en operation. Vi gör ett enkelt exempel;

Kodexempel

<?php
$age = 17;

// Kollar om variabeln $age är mindre än 18
if($age < 18){
  echo "Du är inte myndig!";
}
?>

Läs ut koden som OM $age är mindre än 18, då kommer koden mellan måsvingarna att köras.

Utskrift

Du är inte myndig!

Uppgift

  1. I php finns det mängder av inbyggda funktioner, en som kan användas skrivs date("H") och då får du fram webbserverns klockslag i timmar. Lagra detta värde i variabeln $timme och skriv sedan en if-sats som kollar om värdet är större än 16, om det är fallet så skriver du ut att skoldagen är slut.

Kodexempel

<?php
  $t = date("H");
  echo $t;
?>

Utskrift

05

2.8.2 If - else

Nu när vi kan skriva uttryck så ser vi att det oftast blir två olika alternativ, antingen blir resultatet av uttrycket sant eller så blir det falskt. Vi vet hur vi tar hand om det sanna resultatet, nu är det dags att ta hand om det falska också.
Läs ut koden som Om - annars.

Kodexempel

<?php
$age = 17;

// Kollar om variabeln $age är mindre än 18
if($age < 18){
  echo "Du är inte myndig!";
} else {
  echo "Du är myndig!";
}
?>

Om $age är mindre än 18 körs koden mellan de första måsvingarna, annars körs koden mellan de andra måsvingarna.
Det här kommer vi ganska så långt med. Har vi två val är det alltid if och else som vi skall jobba med.

Uppgift

  1. Skriv nu ut om det är skoldag eller inte, allt mellan 8 och 16 anser vi vara skoldag. Om klockslaget visar utanför den tiden så skriver du ut att det inte är skoldag.

2.8.3 If - else if - else

Ibland så räcker det inte endast med två alternativ då får vi lägga till med if - else if - else för att kunna göra rätt val.

Kodexempel

<?php
$age = 17;

// Kollar om variabeln $age är mindre än 18
if($age < 18){
  echo "Du är inte myndig!";
} else if ($age >= 65) {   // Kolla om $age är större än eller lika med 65
  echo "Du är troligtvis pensionär!";
} else {
  echo "Du är myndig";
}
?>

OM $age är under 18 ..... annars om $age är större än eller lika med 65 ...... annars ....... Avsluta alltid ett flerval med en else-sats.
Det finns ingen anledning att göra följande kontroll;

Kodexempel

<?php
$age = 17;

// Kollar om variabeln $age är mindre än 18
if($age < 18){
  echo "Du är inte myndig!";
} else if ($age >= 18) {
  echo "Du är myndig";
}
?>

Risken är större att du skriver fel och tex missar att ta hand om 18-åringen då du av misstag skriver ($age >18).

På samma sätt kan vi skriva många olika uttryck, det finns ingen begränsning om hur många du kan skriva. Det enda du behöver tänka på är att så fort ett uttryck passar så kommer koden att utföra de instruktioner som finns mellan de måsvingar i direkt anslutning till det korrekta uttrycket.

Kodexempel

<?php
$age = 72;

if($age < 2){
  echo "Du är nog hemma med dina föräldrar!";
} else if ($age < 6 ) {
  echo "Förskolebarn";
} else if ($age < 12 ){
  echo "Hoppas du får många läxor...";
} else if ($age < 20){
  echo "Tonåring, högstadie, gymnasie eller börjat högskolan?";
} else if ($age > 64){
  echo "Pensionär?";
} else {
  echo "Jobba, jobba, jobba!";
}
?>

Uppgift

  1. Ok. Vi överraskar lite, nu skall du skriva ut att "skoldagen inte har börjat" om klockan är före 8, att "skoldagen är slut" om klockan är efter 16 annars skriver du att "skoldagen pågår".

Utan måsvingar

Om du tittar på kod som finns på nätet kommer du rätt var det är upptäcka att det här med måsvingar ägnar sig inte alla av. Det beror på att du kan skippa måsvingen om det bara är en instruktion som skall utföras inne i en selektion. Jag rekommenderar dig dock att skriva ut dem då det är vanligt att det blir fel innan du är helt på det klara med hur det fungerar. Lär dig grunderna först och välj sedan de lite enklare lösningarna.

2.8.4 Switch

Switch-satsen är väldigt användbar när det är många olika alternativ. Även om man kan lösa i stort sett alla selektioner med både if-satser och switch-satser så är de naturligtvis extra bra på olika saker. När vi jobbar med if-satser så jobbar vi med tydligare uttryck, i switch-satsen så är vi mer ute efter att alternativet vi söker efter är ett heltal, ett tecken eller en sträng. Att köra switch med en sträng fungerar inte i alla programmeringsspråk, men det fungerar utmärkt med php.

Om vi tittar på strukturen så har vi en variabel som vi sätter in i parentesen och sedan jämför vi det värdet med olika "case" som vi sätter upp. Varje case är ett värde som variabeln kan anta. Efter alla case är uppräknade så avslutar vi med ett default-case som tar hand om alla andra alternativ. Detta går att jämställa med else-satsen tidigare.

Nästa grej att hålla koll på är "break;" som kommer efter alla satser som hör ihop med ett speciellt "case". Denna "break" avslutar switch-satsen och gör att programmet fortsätter efter den stängande måsvingen. Om vi struntar i break-satsen på rad 7 och rad 10 så kommer svaret alltid bli "Jag känner inte igen sporten" följt av det som du angivit. Detta kan vara användbart om vi vill göra beräkningar men oftast blir det bara svårt att kontrollera.

Enda chansen att upptäcka detta är att testa våra applikationer.

Kodexempel

<?php
$favSport = "fotboll";

switch ($favSport) {
    case "fotboll":             // Valet: fotboll
        echo "Det gröna fältets schack är sporten framför andra.";
        break;
    case "innebandy":           // Valet: innebandy
        echo "Den finaste vinteridrotten!";
        break;
    default:                    // Alla andra val
        echo "Jag känner inte igen sporten $favSport.";
}
?>

Utskrift

Det gröna fältets schack är sporten framför andra.

Om vi har flera "case" som ger samma resultat eller som skall utföra samma sats så kan vi ställa upp koden på följande sätt.

Kodexempel

<?php
// Ange i vilken månad du är född.
$monthOfBirth = 11;

switch($monthOfBirth){
  case 12:                // december
  case 1:                 // januari
  case 2:                 // osv.....
    $season = "vintern";
    break;                // break, annars går vi automatiskt...
  case 3:
  case 4:
  case 5:
    $season = "våren";
    break;                // ...vidare till nästa case...
  case 6:
  case 7:
  case 8:
    $season = "sommaren";
    break;                // ...vilket slutar med att...
  default:                // ... alla skulle vara födda på hösten.
    $season = "hösten";
}
echo "Du fyller år på $season";
?>

Utskrift

Du fyller år på hösten

Uppgift

Skapa ett php-dokument

  1. Vi testar att lösa uppgift 11 med switch-satsen istället. Denna lösning är inte den snyggaste som går att göra men den visar tydligt på skillnaden mellan if och switch. (Om du inte vill skriva alla möjliga åldrar så kör t.ex. upp till 25.)

2.9 Uttryck och operatorer

I parentesen efter ett if- eller ett else-if-kommando så skapar vi ett uttryck. Alla uttryck som vi skapar måste ge svaret SANT eller FALSKT. Inga andra svar kommer fungera.

För att kunna skapa dessa uttryck behöver vi kunna använda oss av ett gäng operatorer inom två olika grupper, jämförelseoperatorer och logiska operatorer.

2.9.1 Jämförelseoperatorer

Dessa operatorer gör precis vad de säger, de används för att jämföra olika värden.

Operator Namn Exempel Resultat av uttrycket
== Lika med $a==12 Sant om $a är lika med 12, annars falskt.
!= Inte lika med, skiljt ifrån $a!=12 Sant om $a inte är lika med 12, annars falskt.
< Mindre än $a<12 Sant om $a är mindre än 12.
> Större än $a>12 Sant om $a är större än 12.
<= Mindre än eller lika med $a<=12 Sant om $a är mindre än eller lika med 12.
>= Större än eller lika med $a>=12 Sant om $a är större än eller lika med 12.
=== Identiska $a===12 Sant om $a har värdet 12 och är ett heltal, 12 är inte lika med "12"!
!== Icke identiska $a!==12 Sant om $a inte har värdet 12 eller inte är ett heltal.

2.9.2 Logiska operatorer

Logiska operatorer används för att kunna skapa sammansatta uttryck.

Operator Namn Exempel Resultat av uttrycket
and och $a and $b Sant om $a och $b båda är sanna, annars falskt.
or eller $a or $b Sant om $a eller $b är sanna, är $a sant kollas inte $b.
xor exklusivt eller $a xor $b Sant om $a eller $b är sanna, men inte sant om bägge är sanna.
! icke !$a Sant om $a inte är sant. (Kallas att negera)

2.9.3 Sammansatta exempel

Att lära sig bygga sammansatta uttryck är viktigt för att skriva bra kod. I många fall så går det att komma runt med flera mindre uttryck men vi vill ju skriva effektiv kod och då är detta bra att kunna.

Exempel Betydelse
$age < 18 or $age > 65 Sant om $age är mindre än 18 eller större än 65. Alltså koll om personen är ungdom eller pensionär.
$age >= 18 and $haveJob != true Sant om $age större än eller lika med 18 och $haveJob är falsk. Personen är myndig och arbetslös.

Uppgift

Skapa ett php-dokument

  1. Skriv på minst ett sätt ett uttryck som gör att det där klockslaget som vi hämtade i förra övningen ger svaret att "Det är skoldag" om värdet är mellan 8 och 16. Hur många sätt kan du lösa uppgiften på?

2.10 Iteration

Det finns flera olika strukturer när vi skapar iterationer inom programmeringen, de är bra på olika saker så för att få den mest effektiva koden behöver du kunna använda flera olika typer.

2.10.1 For-loopen

For-loopen är den mest styrda loopen, här ligger fokus på att en operation genomförs x antal gånger.

Kodexempel

<?php
for($i=0; $i<5; $i++){
  echo "$i<br>";
}
?>

Inom loophuvudet, rad 2, så ser du att det finns tre argument;

  1. Variabeln $i får ett värde, i detta fall 0.
  2. Loopen skall köras så länge som villkoret är uppfyllt, i detta fall så länge som $i<5.
  3. Efter att de instruktioner som skall köras, koderna mellan måsvingarna, så händer något med variabeln, i detta fall så ökar värdet med 1, sedan körs hela loopen igen.

Utskrift

0
1
2
3
4

Uppgift

  1. Ulf har satt in 10 000kr på ett konto med 3 % årlig ränta, hur mycket pengar finns på kontot efter 15 år? Inga fler insättningar görs.
    Välj själv hur du vill skriva ut svaret, med en enda rad eller en rad för varje år.

2.10.2 While-loopen

While-loopen är den loopen där uttrycket ligger i fokus, här vet vi inte hur många gånger som en operation skall utföras men vi vet när vi skall avsluta den.

Kodexempel

<?php
$i = 0;

while ($i < 5){
  echo "$i<br>";
  $i++;
}
?>

While-loopen ser lite annorlunda ut mot for-loopen. De tre argument som var så tydliga i for-loopen finner vi även här;

  1. På rad 2 får variabeln $i ett värde, i detta fall 0.
  2. På rad 4 sätter vi villkoret för loopen. De skall köras så länge som villkoret är uppfyllt, i detta fall så länge som $i<5.
  3. På rad 6 så ger vi varabeln $i ett nytt värde, vi ökar dess värde med 1. Hade vi inte gjort detta så hade vi fått en oändlig loop.

När alla instruktionerna inom måsvingarna har genomförts så kollar loopen om den kan köras igen genom att uttrycket testas.

Utskriften av exemplet blir då;

Utskrift

0
1
2
3
4

Uppgift

  1. Antalet råttor i en stad är 100 stycken, varje månad dubblas populationen av råttor, hur många månader dröjer det innan det finns en miljon råttor i staden?
    Välj själv hur du vill skriva ut svaret, med en enda rad eller en rad för varje månad.

2.10.3 Do-while loopen

Do-while är väldigt lik en while-loop fast med en skillnad, denna loop kommer alltid köras minst en gång. Orsaken till detta är att villkoret kommer sist i loopen, efter att det redan har körts en gång. Inom php så är denna loop inte så extremt användbar, den gör sig bättre inom andra programmeringsspråk framförallt när man skapar menyer eller andra funktioner som alltid skall köras minst en gång.

Kodexempel

<?php
$i = 0;

do{
  echo "$i<br>";
  $i++;
} while ($i < 5);
?>

Våra tre argument som vi nu känner igen finner vi även här;

  1. På rad 2 får variabeln $i ett värde, i detta fall 0.
  2. På rad 7 sätter vi villkoret för loopen. De skall köras så länge som villkoret är uppfyllt, i detta fall så länge som $i<5.
  3. På rad 6 så ger vi varabeln $i ett nytt värde, vi ökar dess värde med 1. Hade vi inte gjort detta så hade vi fått en oändlig loop.

När alla instruktionerna inom måsvingarna har genomförts så kollar loopen om den kan köras igen genom att uttrycket testas.

Utskriften av exemplet blir då;

Utskrift

0
1
2
3
4

2.10.4 foreach

De tre iterationer vi har tittat på kan vi styra på olika sätt, vi kan bestämma startvärdet, hur länge loopen skall fortgå och även hur stora steg vi skall ta. Men om vi vill loopa från start till slut, i tex en array, och göra något med alla komponenter så finns det ett enklare sätt. Då är foreach-loopen att föredra.

Kodexempel

<?php
// skapar en array, kanske med tärningsslag
$array = array(3,3,6,5,1);

// Looar igenom hela arrayen med foreach
foreach($array as $a){
  echo "$a<br>";    // Skriver ut varje värde
}
?>

Vilket ger utskriften;

Utskrift

3
3
6
5
1

2.10.5 foreach med index

Eftersom en array innehåller komponenter som har ett index så kan vi använda detta även i foreach-loopen. Vi kikar på ett gammalt exempel där vi lagrade riktnummer för några städer.

Kodexempel

<?php
// Skapar en array med index som skall användas
$riktnr = array(
   "031" => "Göteborg",
   "040" => "Malmö",
   "07XX" => "Mobil",
   "08" => "Stockholm"
 );

// Skriver ut alla värden i arrayen
foreach($riktnr as $nr => $ort){
  echo "<p>$ort har riktnr $nr.</p>";
}
?>

Vilket ger utskriften;

Utskrift

Göteborg har riktnr 031
Malmö har riktnr 040
Mobil har riktnr 07XX
Stockholm har riktnr 08

2.10.6 break & continue

I alla loopar kan det ibland finnas anledning att avbryta loopen i det specifika varvet eller helt och hållet hoppa ur loopen. Då är break eller continue bra att använda.

Break gör vad den låter som, den avbryter loopen och låter sedan koden fortsätta efter loopen.

Kodexempel

<?php
// loopar från 1 till 10
for($i=1; $i<=10; $i++){
if($i%2 == 0){      // kollar om talet är jämnt
  break;            // Abryter loopen om sant
}
echo "$i<br>";      // skriver ut
}
?>

Notera % som i programmeringsvärlden heter modulus. Modulus är en räkneoperator som utför en heltalsdivision och ger resten som resultat. 4%2 blir då 0, eftersom 4 delat med 2 går jämnt upp och resten blir 0. 7%3 blir då 1, 7 går två gånger i 3 och kvar blir 1.

Vilket ger utskriften;

Utskrift

1

Continue avbryter det varvet som loopen just nu utför, men hoppar sedan vidare till nästa varv.

Kodexempel

<?php
// loopar från 1 till 10
for($i=1; $i<=10; $i++){
  if($i%2 == 1){      // kollar om talet är ojämnt
    continue;           // Abryter loopen om sant
  }
  echo "$i<br>";      // skriver ut
}
?>

Vilket ger utskriften;

Utskrift

2
4
6
8
10

Uppgift

  1. Du skall med hjälp av en iterator samt break och continue se till att skriva ut talen 1-20 med följande regler. Alla tal som är jämnt delbara med 3 skall inte skrivas ut, när du kommer till 15 så skall loopen avbrytas.

Utskriften skall bli

Utskrift

1
2
4
5
7
8
10
11
13
14

2.11 Funktioner

Vi har tidigare tittat på några inbyggda funktioner och det finns väldigt många sådana men vi kan också skapa egna funktioner.

En funktion är en del kod som utför någon beräkning, utskrift eller något liknande som vi behöver i vår kod. En funktion är perfekt att använda till saker som skall göras flera gånger, behöver vi ändra något så andras det bara på ett ställe och slår igenom i hela applikationen. I vissa programmeringsspråk pratar vi om metoder men det är samma sak som en funktion. Grundinställningen till en funktion är att varje funktion skall göra en sak, behöver vi utföra två beräkningar så vill vi oftast dela upp dem i två funktioner.
Varför vill vi ha två funktioner? Tänk dig att vi skall skapa funktioner för att beräkna area och omkrets på en cirkel. I detta exempel kan vi skapa en gemensam funktion som räknar ut båda sakerna samtidigt och skriver ut resultatet, men sedan vill vi bara beräkna arean i en annan uppgift och har vi då en sammansatt funktion så kan vi inte använda den utan måste skapa en ny. Av denna anledning så är det enklare att skapa två funktioner som vi anropar.

2.11.1 Anrop

Nu kör vi lite exempel, först kollar vi på anropet till en funktion. Allt vi gör skall kommenteras och det gäller inte minst funktioner. Eftersom den skall kunna användas flera gånger i samma applikation och även återanvändas i andra projekt och kanske tom av andra utvecklare är dokumentation av en funktion väldigt viktig.

Anropet till funktionen sker i den vanliga koden.

Kodexempel

<?php
/*
 * print_footer
 * Skriver ut en sidfot
*/
function print_footer(){
  echo "<footer>&copy; Förnamn Efternamsson</footer>";
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <?php
  print_footer();
   ?>
</body>
</html>

När du tittar på funktionen så består den av ett funktionshuvud och en funktionskropp. Funktionshuvudet innehåller funktionens namn och eventuella inparametrar. Funktionskroppen är själva koden som utför det som funktionen skall utföra.

Uppgift

  1. Skapa en funktion som skriver ut Jag heter förnamn efternamn och jag går i klass klassens namn. Anropa sedan denna funktion så att texten skrivs ut i dokumentet.

2.11.2 Inparametrar

Vi kan skicka en inparameter till funktionen ifall funktionen behöver någon input att jobba med. Det kan vara vilket data som helst, en sträng, ett tal eller kanske en array.
Vi kollar på ett exempel där vi räknar och skriver ut arean på en kvadrat.

Kodexempel

<?php
/*
 * kvadratens_area
 * Beräknar och skriver ut kvadratens area.
*/
function kvadratens_area($sida){
  $area = $sida * $sida;
  echo $area;
}

$sida = 4;

echo "När kvadratens sida är $sida så blir arean: ";
kvadratens_area($sida);
?>

Utskriften blir då;

Utskrift

När kvadratens sida är 4 så blir arean: 16

Nu använder jag $sida som variabel både i programkoden och som inparameter till funktionen. Det är viktigt att veta att detta är två helt olika variabler. Även om de heter samma så är variabeln inne i funktionen lokal och kommer bara finnas och fungera där inne. Om jag vill använda denna variabel senare så måste jag returnera variabelns värde.

Uppgift

  1. Du skall skapa en funktion som tar $radie som inparameter och sedan skriver ut både area och omkrets för cirkeln inne i funktionen. Detta skall du nu göra med en funktion. Använd konstanten M_PI som värde på PI.
    Anropa sedan funktionen från din kod, gör gärna två olika anrop, med olika radier, för att se att det fungerar som det är tänkt.

2.11.3 Returvärde

Ibland vill vi inte skriva ut från funktionen utan få det uträknade värdet och göra något annat med det än att bara skriva ut det.

Kodexempel

<?php
/*
 * kvadratens_area
 * Beräknar kvadratens area.
*/
function kvadratens_area($sida){
  $area = $sida * $sida;
  return $area;
}

$sida_kvadrat1 = 4;
$sida_kvadrat2 = 6;

echo "Den totala arean på de två kvadraterna med sidorna $sida_kvadrat1 och $sida_kvadrat2 är ";
echo kvadratens_area($sida_kvadrat1) + kvadratens_area($sida_kvadrat2).".";
?>

Utskrift

Den totala arean på de två kvadraterna med sidorna 4 och 6 är 52.

Uppgift

  1. Nu skall du göra om uppgift 2 och istället skapa två funktioner som returnerar resultatet så att du kan skriva ut det genom anrop från koden.

2.11.4 Användning

Nu har du sett exempel på funktioner, då gäller det att fundera på när vi skall använda funktioner. Använd funktioner till:

  • uppgifter som kan avgränsas på något sätt
  • uppgifter som är repititiva
  • kod som du återanvänder i andra program

Ett enkelt sätt är att lagra alla funktioner i en extern fil som inkluderas när den behövs, då ligger inte alla funktioner i samma fil som anropar funktionen. Det är alltid enklare att ändra saker på ett ställe än att hela tiden hålla koll på att alla filer är uppdaterade.

Kodexempel

Filen functions.php

<?php
// functions.php, här samlas alla funktioner

/*
 * kvadratens_area
 * Beräknar kvadratens area.
*/
function kvadratens_area($sida){
  $area = $sida * $sida;
  return $area;
}
?>

Kodexempel

Vår ordinarie programfil

<?php
// inkluderar alla funktioner
include('functions.php');

$sida_kvadrat1 = 4;
$sida_kvadrat2 = 6;

echo "Den totala arean på de två kvadraterna med sidorna $sida_kvadrat1 och $sida_kvadrat2 är ";
echo kvadratens_area($sida_kvadrat1) + kvadratens_area($sida_kvadrat2).".";
?>

Smidigt, nu har jag alla funktioner på ett ställe, behöver jag ändra något så gör jag det bara där. Sedan kan jag inkludera funktionsfilen på varje sida där jag behöver använda en funktion.

Uppgift

  1. Flytta nu alla funktioner som du har skrivit i uppgifterna ovan och lägg dem i en fil som heter functions.php och inkludera den filen så att du når dina funktioner. Alla tidigare funktioner skall fortfarande fungera även om samtliga funktioner är flyttade.

2.12 Fler uppgifter

Här finns några lite större uppgifter som du kan genomföra för att träna lite extra.

2.12.1 Färgad tabell

Här kommer en uppgift där du behöver använda flera iterationer och selektioner för att lösa.

Uppgift - färgad tabell

Uppgiften är att skapa en tabell med två kolumner som listar alla tal mellan 1 och 20. Alla tal som är jämnt delbara med 3 skall ha en annan bakgrundsfärg än de andra, samma gäller för de talen som är jämnt delbara med 5, fast dessa skall ha en tredje färg. I den andra kolumnen skall du rita ut lika många stjärnor som talet i kolumn ett är. Se exemplet nedan om du tycker det verkar oklart.

  • Klurighet 1: hur gör du med tal som både är delbara med 3 och 5?
  • Klurighet 2: Kan du färga hela raden och inte bara cellen?

Utskrift

1*
2**
3***
4****
5*****
6******
7*******
8********
9*********
10**********
11***********
12************
13*************
14**************
15***************
16****************
17*****************
18******************
19*******************
20********************

Redovisning

Redovisa detta moment på följande sätt;

  1. Lägg upp dina övningar på din hemsida. Lägg dem på en sida med tydliga förklaringar eller skapa flera sidor med olika uppgifter. Viktigt att jag, och andra, kan gå mellan sidorna så vi inte missar något.
  2. Länka sidan/sidorna från din samlingssida.
  3. Länka också till CSource och se till att jag den vägen kan se all din kod.
  4. I wordpress så reflekterar du över ditt arbete, berätta vilka uppgifter du gjort och varför. Resonera kring om PHP är svårt eller enkelt och vad du har lärt dig samt vilka problem du eventuellt har haft. Länka också till den sidan, se sidorna, där dina exempeluppgifter finns.
    Frågestöd
    • Hur har arbetet med att lära sig grunderna i PHP gått?
    • Vilket annat programmeringsspråk, om något, känner du dig mest bekväm i? Jämför detta språk med PHP, likheter, skillnader, och en allmän känsla över att programmera i webbmiljö.
    • Vilka resurser har du använt dig av för att lära dig PHP? Någon av de som jag har länkat eller någon annan bra resurs? Har du tips på någon bra resurs så länka gärna denna.