29 november 2006
Opmerking:
Deze tutorial is het laatst geupdate 29 november 2006. In eerdere stadia zijn enkele passages en/of correcties aangebracht door Willem-Jan van Dinter, waarvoor hartelijk dank.
Deze cursus bestaat uit 3 delen.
In paragraaf 3.3 heb ik al uitgelegd wat variabelen zijn en wat je er mee kunt. In dit hoofdstuk wil ik vooral de verschillende typen variabelen bespreken. De eerste 3 paragrafen van dit hoofdstuk zullen gaan over de eenvoudigere variabelen en de laatste 2 paragrafen zullen de wat moeilijkere variabelen behandelen.
Misschien is het goed om nog even te herhalen dat variabelen in PHP niet eerst hoeven te worden gedeclareerd voor je ze een waarde toewijst. Verder is PHP erg makkelijk in het omgaan met de verschillende types variabelen. Onderstaand voorbeeld zal bijvoorbeeld gewoon het getal 5 als output geven, terwijl $getal1 een string krijgt toegewezen.
$getal1 = "2";
$getal2 = 3;
$som = $getal1 + $getal2;
?>
Andere talen zouden hier over struikelen en een foutmelding weergeven waarin staat dat een string niet zo maar bij een getal kan worden opgeteld zonder gebruik van conversiefuncties. PHP snapt echter dat wij gewoon de som van 2 en 3 willen weten en maakt zelf van de string "2" een getal 2.
PHP beschikt wel over conversiefuncties maar in de meeste gevallen zijn deze niet nodig.
Zoals je misschien wel weet van wiskunde op school is een integer een geheel getal zoals 2, 77 en 3.000. Een double daarentegen is een fractioneel getal zoals 8,00 en 1.000,001. Merk hierbij op dat 8,00 in feite wel een geheel getal is, maar geen integer omdat het getal wel een decimale punt bevat. Als je het getal echter wilt afdrukken op je scherm zul je alleen 8 zien omdat PHP standaard de kleinst mogelijke notatie van het getal weergeeft tenzij anders aangegeven door de functie printf ().
Het bereik van integers en doubles is afhankelijk van de server waar PHP op draait. Ik kan je echter wel vertellen dat het bereik meer dan groot genoeg is voor gebruik in de meeste scripts.
Als je met getallen van zeg eens boven de 10 miljard wilt rekenen, of juist getallen kleiner dan 1 miljardste (= 0,000000001), kun je het beste gebruik maken van de zogenaamde wetenschappelijke notatie. Dit is een notatie waarbij een getal meteen gevolgd wordt door E-x of E x. Hierbij is x een integer en staat E-x gelijk aan * 10-x en staat E x gelijk aan * 10x. Kijk voor een paar voorbeelden maar eens in onderstaande tabel.
| Wetenschappelijke notatie | ‘Normale’ notatie |
| 3E+2 | 300 |
| 3.4E+2 | 340 |
| 3E+0 | 3 |
| 3E-2 | 0,03 |
| 3.4E-2 | 0,034 |
Er zijn 3 getallenstelsels die je waarschijnlijk geregeld zult tegenkomen:
Het is mogelijk om in PHP met getallen in deze getallenstelsels te rekenen en getallen te converteren van het ene naar het andere stelsel. Hoe dit precies moet kun je lezen in de manual maar voor het moment wilde ik het alleen even gezegd hebben om het beeld compleet te maken.
Strings zijn aaneengesloten tekenreeksen en zijn in de regel vaak woorden, zinnen of complete teksten. Strings moeten omgeven worden met enkele of dubbele aanhalingstekens. Zodra we in een string een variabele gebruiken (wat mogelijk is!) en we willen als output niet de naam van de variabele, maar de inhoud ervan zullen we dubbele aanhalingstekens moeten gebruiken. Zouden we enkele aanhalingstekens gebruikt hebben, dan zou de naam van de variabelen als output verschijnen. Kijk maar eens naar onderstaand voorbeeld.
$naam = "Erik-Jan";
echo 'Hallo, ik ben $naam!';
echo "
Hallo, ik ben $naam!”;
?>
Op je scherm staat nu:
Hallo, ik ben $naam!
Hallo, ik ben Erik-Jan!
Je ziet dus ook meteen dat het mogelijk is om HTML op te nemen in strings. Verder moet een string met dezelfde soort aanhalingstekens afgesloten worden als waarmee het geopend is: enkele haakjes openen betekent enkele haakjes sluiten en hetzelfde geldt voor de dubbele haakjes.
Als je in een tekenreeks (string) met dubbele aanhalingstekens speciale tekens als $$, " of wilt gebruiken, zul je deze moeten ‘escapen’ omdat het anders tot ongewenste resultaten zal komen. Een niet geëscapete $ laat PHP denken dat het het begin is van een variabele, een niet geëscapete " leidt tot het einde van de string en een niet geëscapete leidt tot een escape (zie hieronder).
Escapen doen we door een backslash voor het teken te zetten. In onderstaande tabel staan enkele mogelijke escapes:
| Teken in de string | Vervanging |
| & | & |
|
" |
" |
Naast deze escapes zijn er nog enkele speciale escapes die vooral layout-technisch erg nuttig zijn:
| Teken in de string | Vervanging |
| n | Een nieuwe regel |
| r |
Een return |
| t | Een tab |
PHP beschikt over een aanzienlijke hoeveelheid functies die speciaal van toepassing zijn om strings. Helaas is in deze cursus niet de ruimte om hier verder op in te gaan, maar (voor de zoveelste keer!) verwijs ik je naar de manual.
Dit is verreweg het simpelste type variabele in PHP (en andere talen) mdat het slechts 2 waarden aan kan nemen: WAAR of NIET WAAR. Omdat PHP in het Engels geschreven is zijn deze waarden eigenlijk trUE en FALSE respectievelijk.
Booleans worden eigenlijk alleen maar gebruikt voor controle structuren. Onderstaand voorbeeld hoef je nog niet te gebruiken (je leert het begrijpen in paragraaf 5.1, maar als je een beetje Engels kan mag het geen probleem zijn.
$naam1 = 'jan';
$naam2 = 'piet';
/* tot en met */
$naam441 = 'klaas';
?>
Dit voorbeeld heeft geen nut zoals je later zult leren, maar het heeft wel nut als we statements gaan gebruiken. Nogmaals, dit bewaren we voor paragraaf 5.1.
Tot nu toe hebben we alleen variabelen gezien die ieder een eigen naam hebben. Ook variabelen van het datatype array hebben een eigen naam, maar variabelen die van hetzelfde soort zijn (bijvoorbeeld allemaal voornamen) zijn wel herkenbaar als zijnde bij elkaar horend.
Misschien is dit een beetje lastig om te begrijpen, maar als je een grote lijst met voornamen in een variabele moet stoppen is het niet handig om variabele namen als
$naam1 = 'jan';
$naam2 = 'piet';
/* tot en met */
$naam441 = 'klaas';
?>
te gebruiken. De reden is dat dit grote problemen oplevert zodra je een actie op al deze variabelen wilt doen. Probeer maar eens alle bovenstaande variabelen in een tabelcel te krijgen. Dit zou betekenen dat je met de hand 441 keer steeds dezelfde regel met een iets andere variabele-naam zult moeten typen.
Dit, en nog een aantal andere reden heeft geleid tot de ontwikkeling van arrays. Probeer je eens een ruimte voor te stellen met veel van die ouderwetse archiefkasten. Stel nu dat je 441 voornamen wilt opslaan ergens in deze ruimte. De methode die ik net voorstelde, namelijk variabele-namen gebruiken als $naam_1, $naam_2 t/m $naam_441 betekent dat we 441 archiefkasten neerzetten, op elke kast de naam van de variabele schrijven en in elke kast de voornaam leggen. Hopelijk zie je in dat dit niet de meest handige manier is. Als je bijvoorbeeld alle voornamen op een lijst wilt hebben, zul je 441 kasten moeten openen.
Een andere manier is het gebruiken van hangmappen. Je kent ze wel, van die mappen waarin je A4′tjes kan doen om zo op een overzichtelijke wijze je archieven te ordenen. Als we er nu voor zouden kiezen om 1 archiefkast in de ruimte te zetten met daarop de naam voornamen en daarin 441 mappen hangen met op elke map een nummer oplopend van 1 tot 441, kunnen we de voornamen in die mappen doen. Je snapt dat dit een stuk praktischer is.
Arrays werken op dezelfde manier. In feite bundel je een grote hoeveelheid variabel onder dezelfde verzamelnaam (in ons voorbeeld van de hangkasten "voornamen"). Vervolgens hebben we nog een naam nodig die elk van de 441 namen uit de grote verzamelnaam voornamen indexeert. Dit doen we door naast de verzamelnaam ook nog een index te vermelden. In ons geval betekent het dat we in plaats van $naam_1 de variabele-naam $voornamen[1] gebruiken waarbij 1 de index is. Zoals je later in je PHP-carriere zult ontdekken hoeft een index geen getal te zijn en mag een $array-element ook meerdere indexen hebben. Dit laatste is bijvoorbeeld nuttig als je van veel mensen de leeftijd wilt onthouden. Omdat het niet handig is om $leeftijd['voornaam'] te gebruiken omdat er meerdere mensen met dezelfde voornaam kunnen zijn, zou je $leeftijd['voornaam']['achternaam'] kunnen gebruiken.
Net als voor strings en in iets mindere mate doubles en integers geldt dat PHP veel functies heeft die met arrays werken. Arrays zijn voor programmeurs als een hengel voor een visser: eigenlijk kun je niet zonder!
Eigenlijk gebeurde het pas in de release van PHP 4 (de laatste PHP-versie op moment van schrijven is 4.3.2) dat PHP binnentradt in de wondere wereld van Object Orientated Programming (OOP). Als je al wat meer ervaring hebt met programmeren zul je deze term in ieder geval kennen, al zul je misschien niet weten wat het precies is. OOP hoort trouwens niet zo zeer thuis in een beginnerscursus PHP, maar voor de volledigheid wil ik het toch even vermelden. Als het je te ingewikkeld voorkomt, kun je het even doorschuiven naar een volgende fase in je PHP-ontwikkeling. Wees dus vrij om deze paragraaf even over te slaan.
Met OOP is het mogelijk om naast de bestaande variabele-types nieuwe types aan te maken. Dit gebeurt in een zogenaamde class. Voor je dit nieuwe datatype kunt gebruiken, zul je eerst een object moeten aanmaken van de class. In feite zeg je dan gewoon tegen PHP dat de nieuwe variabele die je net hebt aangemaakt van het datatype is die de class beschrijft. In OOP-termen heet dit dat de nieuwe variabele een instance is van de class.
Een class (en dus ook de instance van deze class) kan beschikken over bepaalde functies die alleen gelden voor die betreffende class of instance. Deze functies (member-functies genoemd) worden gecreëerd in de class en hebben betrekking op de variabelen binnen de class. Merk hierbij trouwens op dat het datatype object dus weer andere datatypes kan omvatten: sterker nog, één van de meest bruikbare aspecten van objecten is de mogelijkheid dat een object weer meerdere andere objecten omvat!
OOP wordt vooral veel gebruikt in situaties waarin er meerdere mensen werken aan één project. Het voordeel is dan namelijk dat je niet de functies zelf hoeft te kennen, maar alleen maar hoeft te weten wat je er mee kan doen en welke input ze nodig hebben.
Zoals al gezegd in paragraaf 1.2 kan PHP acties ondernemen afhankelijk van bepaalde omstandigheden:
Deze en soortgelijke statements die afhankelijk zijn van een bepaalde statement noemen we controle structuren. Voor bijna alle PHP-toepassingen zul je gebruik moeten maken van ten minste één van de hieronder behandelde controle structuren.
Voor we gaan beginnen met het bespreken van de verschillende controle structuren, moeten we eerst een aantal mogelijkheden bespreken om verschillende statements te combineren. Als ik bijvoorbeeld wil weten of het vandaag maandag is en of we momenteel in november leven, zal ik deze 2 statements samen moeten testen. Nu is het mogelijk om eerst te testen of het maandag is en daarna alleen als het echt maandag is te testen of we in november leven en pas als deze tweede statement ook waar is een bepaalde actie te ondernemen, maar je zult begrijpen dat het makkelijker is om beide statements tegelijk te testen.
In onderstaande tabel vind je een aantal logische operatoren om 2 of meer statements te combineren.
| Operator | Betekenis |
| and |
Is waar als zowel het statement links van het and-teken waar is én als het statement rechts van het and-teken waar is. |
| or |
Is waar als het statement links van het and-teken waar is of als het statement rechts van het and-teken waar is. |
| ! |
Is waar als het statement niet waar is. Het teken ! moet dan ook worden uitgesproken als niet. |
Naast deze 4 operatoren zijn er nog && en ||, maar die zijn meer bedoeld voor de meer complexe control structures. Als je hier meer over wilt weten, kun je dat in de manual nalezen.
Verder zijn er ook nog zogenaamde vergelijkingsoperatoren. Het hoeft namelijk niet zo te zijn dat je wilt kijken of 2 statements precies aan elkaar gelijk zijn: misschien wil je wel weten of de én groter is als de ander. Voor zulk soort vergelijkingen hebben we de verschillende vergelijkingsoperatoren:
| Operator | Betekenis |
| == | Is gelijk aan |
|
!= |
Niet gelijk aan |
| < | Kleiner dan |
|
> |
Groter dan |
| <= |
Kleiner dan of gelijk aan |
| >= | Groter dan of gelijk aan |
Zoals beloofd in paragraaf 4.3 zou ik onderstaand voorbeeld wat nuttiger maken:
if (TRUE)
echo "Ja, het klopt!";
else
echo "Nee, jammer joh!";
?>
Als we in het voorbeeld TRUE vervangen door een statement dat waar of niet waar kan zijn begint het al wat nuttiger te worden. Stel we vragen ons af of we een bezoeker moeten verwelkomen met "Hallo meneer!" of "Hallo mevrouw". We hebben (bijvoorbeeld door het aan de bezoeker te vragen door middel van een Javascript-popupje) de beschikking over een variabele die ofwel "man" is ofwel "vrouw". Met onderstaand script kunnen we dan kijken wat de juiste groet moet zijn.
if ($geslacht == "man"){
echo "Hallo meneer!";
}else{
echo "Hallo mevrouw!";
}
?>
Als de statement tussen de haakjes waar is (wat in dit geval dus betekent dat $geslacht == "man") wordt alles tussen de eerste set { en } (accolades) uitgevoerd. Als de statement niet waar is, worden alle opdrachten tussen de tweede set { en } uitgevoerd. Een else-gedeelte van een if-statement is overigens niet verplicht.
Opmerking:
Merk op dat we een dubbel =-teken gebruiken in plaats van een enkele. De reden is dat het enkele teken gebruikt wordt voor een toewijzing. Als we dus in bovenstaand if-statement een enkel =-teken hadden gebruikt, had PHP eerst de waarde "man" aan $geslacht toegekend en vervolgens getest of $geslacht == "man" wat dus altijd waar is!
In het voorbeeld hierboven kunnen er slechts 2 waarden zijn voor de variabele $geslacht , “man” en “vrouw”. Uiteraard zijn er veel variabelen die meerdere waarden kunnen aannemen. Stel je wilt weten welke maand het nu is. Helaas heeft PHP geen functie of standaard variabele die de Nederlandse naam van de maand geeft. Wel is er een functie die het nummer van de maand geeft. Deze functie is date('n').
Opmerking:
Zoals bijna elke computertaal begint PHP met tellen bij 0 in plaats van bij 1. Dit is voor computers makkelijker rekenen. Als gevolg hiervan correspondeert maand nummer 0 met de maand januari.
Als we meerdere statements willen testen (eerst testen we of $maand == 0, dan $maand == 1 enz.) maken we gebruik van een combinatie van else en if namelijk elseif. Kijk maar eens naar onderstaand voorbeeld..
$maand_nummer = date('n');
if ($maand_nummer == 0){
echo "januari";
}elseif ($maand_nummer == 1){
echo "februari";
}
// Equivalent voor $maand_nummer 2 tot en met 9
}elseif ($maand_nummer == 10){
echo "november";
}else{ // Kan alleen nog maar 11 zijn!
echo "december";
}
?>
Stel, je wilt de 441 voornamen die we in de paragraaf over arrays in een array hebben gestopt printen. De voornamen staan in de variabelen $voornaam[1] tot $voornaam[441]. Het is uiteraard
ondoenlijk om voor elk van deze variabelen een echo-statement te maken. Voor dit probleem hebben de ontwikkelaars van PHP een oplossing bedacht: de for-loop. Onderstaande code zou ons probleem oplossen.
for ($i=0; $i < count ($voornamen); $i ){
echo $voornaam[$i] . "
“;
}
?>
Als we de regel die begint met ‘for’ stuk voor stuk bespreken zien we dat de for-loop 3 argumenten heeft.
$i gebruikt.count ($voornamen) retourneert het aantal elementen in de array. Als we zeggen dat $i moet lopen van 0 tot (niet tot en met!) het aantal elementen in de array. Dit betekent dus gewoon dat we elk element langs lopen, aangezien de index van die array loopt van 0 tot het aantal elementen – 1.$i 1 moeten ophogen. Als we dit vergeten, blijft $i altijd 0 en blijft de loop zich eindeloos herhalen. Dit zal er voor zorgen dat de server vast loopt en dat willen we natuurlijk voorkomen!
Als je geen fouten hebt gemaakt resulteert een for-statement in een zogenaamde gebonden loop . Het is namelijk precies duidelijk hoe vaak de loop doorlopen zal worden en in dat oogpunt is de loop min of meer ‘voorspelbaar’. De structuur is minder voorspelbaar omdat er in het argument geen impliciet einde van de loop is ingebouwd.
De syntax van de while-loop is while (voorwaarde) { expressie}. Zolang de voorwaarde TRUE is wordt de expressie uitgevoerd. Als de voorwaarde op een gegeven moment FALSE is, gaat PHP verder met het parsen van de code na de while-loop.
Bedenk je eens een vrachtwagen in met een laadruimte van 90 m2. In de vrachtwagen moeten dozen van 54m2. Met onderstaand voorbeeld kun je dan kijken hoeveel dozen er in de vrachtwagen passen (het is geen reëel voorbeeld, maar het leert je wel het principe van de while-loop):
$vrije_ruimte = 90;
$grootte_doos = 4;
$aantal_geladen_dozen = 0;
while ($vrije_ruimte > $grootte_doos){
// Er is nog ruimte!
$aantal_geladen_dozen += 1; // Verhoogd het aantal met 1
// Verlaag de vrije ruimte
$vrije_ruimte = $vrije_ruimte - $grootte_doos;
}
// Echo het aantal dozen dat er in past
echo $aantal_geladen_dozen;
?>
Op je scherm zal nu 22 staan. Immers, als er 22 dozen van 4 m2 in de wagen zitten is er nog 2 m2 vrij en zal de voorwaarde $vrije_ruimte > $grootte_doos FALSE retourneren wat de loop zal doen stoppen.