Programmera med PHP

By , Marie. Latest revision .

Du skall träna dig på grunderna i PHP genom att utföra ett antal mindre programmeringsövningar.

Det handlar om grunder såsom problemlösning och programmering med variabler, if-satser, loopar, arrayer, funktioner och att dela upp koden i olika filer.

#Förkunskaper

Du har grundläggande kunskap om att programmera med PHP.

Du har PHP i din PATH och kan exekvera kommandot php i terminalen.

Du använder PHP 8.0 eller högre.

#Introduktion och förberedelse

Uppgifterna löser du genom att skriva kod i filer som du exekverar via terminalen.

Spara alla filerna under me/php.

Du skall ha ett main-program och den koden sparar du i filen main.php. Main-programmet skriver ut menyn och läser input från användaren och utför sedan en uppgift. När uppgiften är utför återgår menyprogrammet till att vänta på nästa input från användaren.

Lösningen på varje uppgift skall kodas som en funktion med ett bestämt namn. Samtliga funktioner placeras i filen src/functions.php som inkluderas i main.php. När koden växer blir det troligen fler funktioner som delas upp i olika filer och då är det bra att samla dem i en underkatalog och src är ett vanligt namn på en sådan katalog.

Så här kan det se ut när de första menyvalen är implementerade.

De första menyvalen är implementerade.

#Strikta type i PHP

Se till att alla dina filer inleds med att använda strikta typer.

<?php

declare(strict_types=1);

#Konfigurationsfil och felutskrifter

Skapa en fil config.php och lägg dit följande kod som sätter på felutskrifter. Detta gör att det blir tydligt om något är fel i din kod. När man utvecklar sin kod vill man att dessa felmeddelanden syns. När man har levererat sin kod till “produktionsläge” vill man dock stänga av dem som en säkerhetsåtgärd.

Sätt på felutskrifter i config.php.

error_reporting(-1);              // Report all type of errors
ini_set("display_errors", "1");   // Display all errors

Se till att denna filen inkluderas som den första filen i din main.php. Inkludera denna filen innan du inkluderar src/functions.php.

#DocBlock kommentarer

Ovanför varje funktion skall du skriva en DockBlock kommentar och ge en kort introduktion till vad funktionen gör. Dessa kommentarer gör att vi senare kan automatgenerera dokumentation för koden.

Det är mest lämpligt att använda engelska när man skriver kod och kommentarer.

/**
 * Prints details about this program.
 */
function about(): void {
    // some code
}

När funktionerna växer kan man även dokumentera inkommande parametrar till funktionen, vad den returnerar och om den kastar exception.

#Utvecklingsmiljö med validatorer

Du kan köra statisk kodvalidering för att kontrollera att din PHP-kod stämmer överens med kodstandard och att den inte innehåller någon “skräpig kod”.

dbwebb validate php

De validatorer som körs är främst för phpcs som är kodstandard och phpmd som upptäcker misstänkt “skräpig kod”.

#Katalogstruktur

Så här ser din katalogstruktur ut i me/php när du är redo att börja.

$ tree .
.
├── config.php
├── main.php
└── src
    └── functions.php

1 directory, 3 files

Kommandot tree kan du installera med din pakethanterare.

# Cygwin
apt-cyg install tree

# Mac
brew install tree

# Linux, WSL
apt install tree
aptget install tree

Du kan dubbelkolla att grundstrukturen är korrekt genom att köra kommandot dbwebb test php.

#Mall till main.php

Om du har löst kraven enligt ovan så har du en grov mall till din main.php som inleds så här.

<?php

declare(strict_types=1);

require "config.php";
require "src/functions.php";

echo "Ready to begin some hard coding...";

Provkör ditt main-program så du vet att grundstrukturen är på plats.

php main.php

#Uppgift 1: Ett menydrivet program i terminalen

Skapa grunden för ditt menydrivna program. Följande menyval skall finnas.

1) Skriv ut detaljer om programmet
Q) Avsluta

Om användaren skriver in 1 så skall programmet skriva ut en kort beskrivning av programmet samt vem som skrivit det. Koden för att utföra utskriften skall skrivas i en funktion about().

Om användaren skriver in q eller Q så skall programmet avslutas via funktionen exitProgram() samt skriva ut ett avslutningsmeddelande.

När programmet startar skall du skriva ut en välkomsttext och en ascii-bild (välj själv motiv på bilden).

Om användaren skriver in ett val som inte finns så anropas en funktion notValidChoice() som skriver ut ett meddelande att det var ett felaktigt menyval.

Alla funktioner placeras i filen src/functions.php.

När det valda menyvalet är utfört så visas menyn och ascii-bilden igen.

För tips, leta i manualen.

#Uppgift 2: Detaljer om din PHP installation

Om du i uppgift 1 använde if-sats för att anropa rätt funktion för menyvalen main.php, så byt ut din if-sats till en switch-sats eller varför inte en match().

Lägg till menyvalet “2) Detaljer om PHP” som gör enligt följande.

  • Skriv ut versionen av PHP.
  • Skriv ut vilket operativsystem som ligger i botten av PHP-installationen.
  • Sökväg till PHP binären.
  • Visa värdet för konfigurationen av display_errors via ini_get().
  • Visa värdet för konfigurationen av display_startup_errors via ini_get().

Döp funktionen till printPhpVersion().

För tips, leta i manualen.

#Uppgift 3: Tid och datum

Företaget “Bäst Reklam” har en reklamkampanj, som startades upp i 1:e mars i år och ska lanseras på lucia den 13:e december samma år (Svensk tid). Företaget har ett litet kontor på Manhattan i New York och huvudkontoret i Karlskrona. Personalen är svensktalande men de ringer till varandra på konstiga tider. För att slippa väcka varandra i onödan, så vill VD:n att de anställda möts av följande välkomstmeddelande när de loggar in.

Lägg till menyvalet “3) Tid och datum” som ger följande utskrift.

OBS! Aktuell tid ska vara dagens datum, använd date() och glöm inte att sätta tidzonerna innan.

Döp funktionen till printTimeAndDate(). Tips: Antal dagar kvar på kampanjen kommer att variera beroende på dagens datum. Hur många sekunder går det på en dag?

För tips, leta i manualen.

#Uppgift 4: Stränghantering

Prorektor Eva Pettersson hälsade nya studenter välkomna till BTH på introduktionsveckan. Men när webbansvarig skrev in det på webbsidan, så blev det lite fel. Hjälp till att rätta strängen genom att göra ett enkelt rättstavningsprogram!

$faultyStr = " ”Varmt välkommen till BTX och till första dagen på dina studier hos oss”. Men dessa ord hälsade prorektor Eva Pettersson alla nya STUDENTER välkomna.";

Lägg till menyvalet “4. Stränghantering” som ger följande utskrift.

Döp funktionen till printString(). Kopiera ovanstående variabeldeklaration inklusive dubbelfnuttarna och semikolon. Använd de inbyggda funktionerna i php för att ändra i strängen.

Tips: skriv ut strängen för varje rättning du gör när du jobbar med strängen för att se om det blir som du tänkt dig. Dessa kontrollutskrifter tar du bort när du färdig sen. OBS! Det är fyra fel i strängen; bland annat inledande mellanslag. Hur löser du det problemet med kommandona nedan?

För tips, leta i manualen.

#Uppgift 5: Arrayer med siffror

Nedskräpningen på tre badstränder i Lomma, Vellinge och Svedala mättes sommaren 2020. Det som skiljer sig mest i mätningarna mot andra miljöer är att nedskräpningen av plast är så hög på stränderna. Skräpmätningen görs på samma yta av stranden varje dag i minst sju veckor. Se resultatet:

Lägg in siffrorna från tabellen i en array som decimaltal med punkt utan procenttecknet.

Lägg till menyvalet “5) Arrayer med siffror” som ger följande utskrift.

Döp funktionen till printNumberArrays().

För tips, leta i manualen.

#Uppgift 6: Arrayer med strängar

32,6% av nedskräpningen på stränderna var cigarettfimpar medan den är uppmätt till 64.5% i tätort, 49.9% i förort och 43.4% i parkmiljö. Det tar cirka 1-5 år för naturen att sönderdela en cigarettfimp till mikroplast (fimpens filter innehåller plast). Mikroplast kan ta 100 år innan den försvinner, om den ens gör det. Allt enligt “Håll Sverige rent”.

För att få reda på vad nedskräpningen på stränderna beror på, till exempel att 32.6% är cigarettfimpar, så vill vi skapa en key/value array med orsaken som key och procenten som value. Kopiera strängen nedan till din funktion och bygg ihop en key/value array. För att du ska få träna på olika iterationer, så använder du for-loop i första utskriften och foreach-sats i utskriften av den sorterade arrayen.

"Cigarettfimp Snusprilla Annat Glas Metall Organiskt Papper/kartong Plast"

Lägg till menyvalet “6) Arrayer med strängar” som ger följande utskrift.

Döp funktionen till printStringArrays(). Tips: Vad är skillnaden på sort() och asort()? Vad menas med associativ sorting?

För tips, leta i manualen.

#Extrauppgift: Fibonaccitalföljd

Skapa en funktion som använder Fibonaccital. De ser ut så här 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 etc. Där varje tal är summan av de två föregående talen.

Lägg till menyvalet “A) Fibonacci”.

  • Skriv ut talföljden upp till och med 55
  • Skriv ut summan av alla udda Fibonaccital under 1.000.000 på en ny rad.

Döp funktionen till fibonacci().

Tips: Summan blir 1089154.

Fibonaccitalföljder kan starta antingen på 0 eller 1. Ryktet säger att Fibonacci själv började på 1. Vill du läsa mer om Fibonaccital, se här.

#Extrauppgift: Password

Hitta tre hashade lösenord!

För att komma ihåg sitt lösenord så har hemlige Arne skrivit upp det. Han är dock lurig och har skrivit upp det blandat med falska lösenord. Eftersom han blev hackad av Trazan och Banarne förra året så har han “hashat” lösenordet på tre olika sätt, för att göra det svårare att hacka för dem att hacka honom igen. Du kanske kan hacka lösenordet!

Ett exempel på md5 hash på lösenordet:

# $pwd = md5("Hello2world!");
# echo $pwd;
# 025cfbe826280df9815be962cc272b2c

Enligt Myndigheten för samhällskydd och beredskap, så är md5 inte tillräckligt bra för att hasha lösenord. Det beror på att dagens datorer med ett modern grafikkort kan generera 7 miljarder MD5 förslag per sekund.

Hemliga Arnes lösenord och hans lista med hashade lösenord:

$password = "Hello2world!";
$hashArray = array('Uryyb3jbeyq!', 'Uryyb2ibeyq!', 'Uryyb2jbey!', 'Uryyb2jbeyq!', 'Uryyb2jbeyg!',
    '$2y$10$Nl1KcQWR.saeHZryyy4FueawpZqoyx.eXVglabfekJNecrdvULy/K',
    '$2y$1O$Nl1KcQWR.saeHZryyy4FueawpZqoyx.eXVglabfekJNecrdvULy/K',
    '$2y$10$Nl1KcQWR.saeHZryyy4FueawpZqoyx.eXVqlabfekJNecrdvULy/K',
    '$2y$10$.tCflgh5pOcG/HVf.QsXguTUkelucRBg0CGUpRhxtrBW4ZhsK6tKu',
    '$2y$10$.tCflgh5pDcG/HVf.QsXguTUkeluoRBg0CGUpRhxtrBW4ZhsK6tKu',
    '$2y$10$.tCflgh5pDcG/HVf.QsXguTUkelucRBg0CGUpRhxtrBW4ZhsK6tKu');

Försök hitta hans hashade lösenord i listan. Det finns med tre gånger med tre olika hashmetoder.

Lägg till menyvalet “B) Password” som skriver ut summan av de tre positionerna i $hashArray ovan.

Döp funktionen till printPassword(). Kopiera variablerna ovan till din funktion. Du har rätt svar om svaret är samma som precis myndig och får ta körkort.

För tips, leta i manualen.

För mer information, besök Myndigheten för samhällskydd och beredskap.

#Extrauppgift: Filhantering

Det finns två filer under katalogen files; sherlock.txt och serialized.txt.

Kopiera filerna med kommandot cp, så här.

# Stå i `me/php`
cp ../../example/php/examples/*.txt .

Titta på innehållet i filerna.

Lägg till menyvalet “C) Filhantering” som ger följande utskrift.

Döp funktionen till printFile()). Skapa två variabler i din funktion med filnamnen i och kalla dem $file1 och $file2. Tips: Läs innehållet i sherlock.txt från tecken 17 och 15 tecken framåt och skriv ner i en ny fil test.txt och skriv ut innehållet i filen test.txt.

För tips, leta i manualen.

#Redovisning

Besvara följande frågor i din redovisningstext.

  • Berätta hur det gick att lösa uppgiften, var något extra svårt, lurigt, krångligt eller flöt det på smidigt?
  • Är det något som du är extra nöjd med i ditt resultat från uppgifterna?

#Publicera

Avsluta uppgiften så här.

  1. Kontrollera att din kod validerar med dbwebb validate php.

  2. Testa ditt resultat så att det passera de automatiska testerna med dbwebb test php.

  3. När du är klar kan du publicera resultatet med dbwebb publish php.

#Revision history

  • 2021-09-10: (A, mos) Första utgåvan.

Document source.

Category: kurs webtec.