Valg og funktioner

Geany

Fra nu af skal vi anvende geany til at skrive kode i. For at afvikle koden skal vi anvende Geanys funktionalitet. Det gør du på følgende måde:

Start Geany og gå til menuen BuildSet Build Commands.

Skriv den fulde stil til PHP i afsnittet Execute commands som herunder.

Sti på windows:

c:\xampp\php\php "%f"

Sti på Mac: /

Applications/XAMPP/bin/php/php "%f"

Sti på Ubuntu: Ingen ændringer

Herefter vil du kunne taste F5, og så vil koden blive udført i et terminalvindue ved siden af.

Input

Til de næste par øvelser har vi brug for at kunne lave et input til programmet, så vi kan lade brugeren træffe nogle valg. Det gøres ved at anvende funktionen: fgets(STDIN).


<?php
echo "Skriv noget: ";

$input = fgets(STDIN);

echo "\nDu skrev: $input";
?>

Skriv noget: Hej PHP

Du skrev: Hej PHP

Det gode ved PHP er, at vi ikke skal bekymre os om det er værdier eller tekst vi laver som input. Det holder PHP holder selv styr på for os.

Læg mærke til... at jeg anvender \n til at få output til at springe en linie ekstra. Det er for at gøre output mere læsbart.

Valg

Når vi skal have PHP til at reagere på forskellige tilfælde (conditions), kan vi anvende 3 forskellige tilgange:

  • Switch-struktur
  • if/else-struktur

Herunder vil jeg vise hvordan de anvendes i en simpel situation, hvor en brugers svar skal bruges. Konkret skal brugeren svare på om han er en mand eller kvinde. Der skal svaret 1 for mand og 2 for kvinde.

Switch

Når man sætter betingelserne op på denne måde opretter man en case for hver situation. Hvis a så ..., hvis b så ..., hvis c så ... osv. Lad os se et eksempel:


<?php

echo "Skriv 1 for dreng og 2 for pige: ";

$input = fgets(STDIN);

switch ($input) {
	case 1:
		echo "\nDu er en dreng";
		break;
	case 2:
		echo "\nDu er en pige";
		break;
	default:
		echo "\nDu har vist skrevet forkert";
	}
?>

Skriv 1 for dreng og 2 for pige: 2

Du er en pige

Inde i switchen (kontakten) har vi oprettet 3 cases. En hvor man er en dreng, en hvor man er en pige og en hvor man har skrevet forkert.

Læg mærke til at der kommer et break inde i hver case. Et break gør, at den del af programmet der kører lige nu bliver afbrudt. I dette tilfælde switch()

Denne måde at kode på kan altså grundlæggende skrives som

switch (** det som undersøges **) {

	case ** betingelse 1 **:
		** gør noget **
		break;

	case ** betingelse 2 **:
		** gør noget andet**
		break;
	
	.
	.
	.

	default:
		** gør noget tredie **

	}
?>

Koden går altså ind og efterprøver om den enkelte case er sand eller ej. Vi kan sætte lige så mange cases på som vi har behov for, blot den sidste er default.

Fordelen ved denne metode er overblikket

If/else

En anden måde at gøre det samme er ved hjælp af en if/else struktur. Den samme problemstilling som ovenfor vil se ud som her:


<?php
echo "Skriv 1 for dreng og 2 for pige: ";

$input = fgets(STDIN);

if ($input == 1) {
	echo "\nDet er en dreng";
	} 
	elseif ($input == 2) {
		echo "\nDet er en pige";
		}

	else {
		echo "\nDu har vist skrevet forkert";
		}
?>

Skriv 1 for dreng og 2 for pige: 1

Det er en dreng

Egentlig er tankegangen den samme her, men læg mærke til at vi ikke skal breake funktionen. Det gør den af sig selv.

Vi kan altså opstille if/else på følgende måde:


if (betingelse_1) { 
	** Gør noget **}
elseif (betingelse_2) { ** Gør noget andet **; }
. . . else { ** Gør noget tredie **; }

Koden går også her ind og efterprøver om den enkelte betingelse er sand eller ej. Vi kan sætte lige så mange elseif på som vi har behov for, blot den sidste er en else.

Indlejring

Man kan også indlejre dem i hinanden i lige så mange lag som man vil. Man kan have:

  • swithes i swithes
  • switches i if/else
  • if/else i switches

En analogi kan være et bibliotek - med bogreoler - med bøger - med sider - med ord - med bogstaver.

Det eneste man skal huske på er, at det skal give mening. For man risikerer at lave koden så kompleks at man ikke kan overskue den mere. Gør ikke koden mere kompleks end andre også kan sætte sig ind i den.

Switch eller if/else

Det afgørende handler om overblik og effektivitet. Generelt vil jeg anbefale at man anvender if/else fordi der er mindre skrivearbejde i den, men især fordi den mere logisk tvinger os til at opdele det vi arbejder med (overblik).

Kontrol statements

Når man arbejder med valg, funktioner og løkker, har man stor fordel af at kunne afbryde dem når opgaven er løst.

Det kan f.eks. være at at afbryde den helt eller/og at give videre hvad resultatet var. Til dette formål anvender vi break og return:

  • break
  • break er et kontroludsagn man kan indsætte i en løkke, hvis den skal afbrydes. Det kan f.eks. være hvis en speciel betingelse er opfyldt. Hvis man indsætter break i orden af sin kode, så afsluttes hele koden.

  • return ** værdi **
  • return fungerer grundlæggende som break. Forskellen er, at return svarer med noget. Det kan være:

    • true/false - også kaldet boolean
    • En værdi
    • en tekststreng

Forestil dig at du undersøger temperaturen i en fryser. Her er hvad programmet skal gøre for forskellige værdier det får af en måler:

Tilstand Handling Svar
Temperatur konstant Gør intet return 0
Temperatur falder Mindre køling return 1
Temperatur konstant Mere køling return 2
Ingen temperatur målinger Send alarm return 3

Herefter vil vi kunne kalde return-værdien ved hjælp af enten en switch eller en if/elseif/else struktur og programmere de handlinger der hører til hver værdi. Der kommer nogle eksempler herunder.

Funktioner

Indtil videre har vi arbejdet med PHP's indbygge funktioner. Nogle gange kan det være smart at kunne lave sine egne funktioner. Det kan både være fordi man skal bruge den samme kodestump flere gange, men det kan også være for overblikkets skyld.

Herunder er der et eksempel på en simpel funktion der udskriver et tilfældigt tal 10 gange, men kun hvis tallet er 4 eller derover:


<?php
function tilf_tal(){
	$tal = mt_rand(1,10);
	
	if($tal >= 4){
		return $tal;
	}
}

for($i=1;$i<=10;$i++) {
	echo tilf_tal()." - ";
}
?>

 -  - 4 - 4 -  - 6 -  - 10 -  - 7 -

Funktioner gør altså at man kan lave nye funktioner, som man så kan kalde i sin kode. Det er især smart hvis den skal anvendes flere gange, så har man kun et sted i koden der skal rettes hvis funktionen skal ændres.

Funktioner med parametre

Som det er nu, så skal vi have alle parametre i koden. Det kan vi ændre på følgende måde, hvor vi sætter:

  • $a - mindsteværdi
  • $b - størsteværdi
  • $c - beskriver mindsteværdien på tallet der skal afleveres


<?php
function tilf_tal($a,$b,$c){
	$tal = mt_rand($a,$b);
	
	if($tal > $c){
		return $tal;
	}
}

$antal=20;

for($i=1;$i<=$antal;$i++) {
	echo tilf_tal(1,10,4)." - ";
}
?>

 - 5 - 6 -  -  -  -  - 5 - 6 -  - 10 - 8 - 10 - 10 - 6 - 7 -  - 9 - 5 -  -

Herunder er funktionen andengrad() lavet. Læg mærke til indrykningerne, som er lavet for at gøre koden er mere overskuelig.


<?php
function andengrad($a,$b,$c) {
	
$D = pow($b,2)-4*$a*$c;
echo "\n\nDiskreminanten er: $D\n";

	if ($D>0){
		$x1 = (-$b+sqrt($D))/(2*$a);
		$x2 = (-$b-sqrt($D))/(2*$a);
		
		if ($x1<$x2){echo "Nulpunkterne er: $x1 og $x2";}
			else {echo "Nulpunkterne er: $x2 og $x1";}
		}
	elseif ($D == 0){
		$x0 = -$b/2*$a;
		echo "Nulpunktet er: $x0";
		}
	else {
		echo "Der er ingen nulpunkter";
		}	
}

andengrad(1,-5,6);
andengrad(1,2,1);
andengrad(2,3,3);
?>

Diskriminanten er: 1
Nulpunkterne er: 2 og 3

Diskriminanten er: 0
Nulpunktet er: -1

Diskriminanten er: -15
Der er ingen nulpunkter

Globale variabler

Nogle gange har man brug for at kunne anvende en variabel der er udregnet i en funktion. Det kan give nogle problemer, da variabler er defineret indenfor deres sammenhæng (scope). - f.eks. en funktion. Se eksemplet herunder:


<?php
function test() {
	$var = 5;
	}
test();
echo $var;
?>

PHP Notice:  Undefined variable: var in /var/www/html/output.php on line 6

Som du kan se kan vi ikke umiddelbart anvende den variabel der er i funktionen. Det er fordi variabler kun er defineret inde i funktionen. For at kunne anvende den uden for funktionen skal den være global. Se eksemplet:


<?php
function test() {
	global $var;
	$var = 5;
	}
test();
echo $var;
?>

5