PHP/HTML en strings

PHP en HTML-broncode

PHP maakt HTML niet overbodig, het werkt er nauw mee samen. De webserver moet wel weten dat iets PHP is. Daarvoor krijgt een bestand .php als extensie, zoiets als index.php of bestellen.php. Binnen de HTML-broncode geven we met

<?php // Hier schrijf je broncode. ?>

aan dat iets geen HTML, maar PHP is. De PHP engine interpreteert (vertaalt) de broncode en voert de erin beschreven opdrachten (statements) uit. Met de opdracht echo wordt de tekst die erna komt op de webpagina geplaatst.

De broncode ziet er dan bijvoorbeeld zo uit:

<!DOCTYPE html> <html lang="nl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP-voorbeeld</title> </head> <body> <h1>Dit is een gewone pagina</h1> <?php echo "Of toch niet?"; ?> </body> </html>

Variabelen

Je hebt al programmeerervaring. Je weet dus wat een variabele is of een string. Er zijn wel een paar dingen bijzonder in PHP:

Variabelen beginnen altijd met een dollarteken, zoals: $naam, $beroep, $gewicht. In het volgende voorbeeld zie je hoe je variabelen gebruikt:

// Variabelen aanmaken (variabelen beginnen in PHP met '$') // string $naam = "Jan Janssen"; // integer $leeftijd = 27; // float $spaarsaldo = 1050.68; // boolean $getrouwd = false; /* Bij SPB/SPAD hebben jullie geprogrammeerd in Processing met een statisch getypeerde programmeertaal. Dat merk je bijvoorbeeld op het moment dat je in Processing een variabele declareert: je geeft (naast de naam en eventueel een waarde) het type van de variabele op: */ int aantal = 50; /* Types van variabelen zijn dus vóór programmauitvoer (tijdens het compileren) bekend, en kunnen niet meer wijzigen. Een eerste verificatie van het programma (of er bijvoorbeeld nergens strings bij integers worden opgeteld) kan op dat moment al plaatsvinden, waardoor het programma snel is en minder fouten bevat. PHP daarentegen is een dynamisch getypeerde taal: types hoeven niet worden aangegeven bij het declareren van een variabele. Het type zal tijdens het uitvoeren van het programma worden afgeleid op basis van de waarde die er in wordt gestopt (type inference). Dit leidt ertoe dat programma's sneller geschreven kunnen worden, maar mogelijk manifesteren zich fouten tijdens uitvoer. In bovenstaand voorbeeld is $leeftijd van het type integer omdat 27, een geheel getal, toegekend is. Tijdens de uitvoering van het programma kun je aan een variabele andere waarden toekennen waardoor ook het datatype verandert. */ // Variabelen aanpassen $leeftijd = 27.33; // integer -> float $leeftijd = "27 jaar"; // float -> string $leeftijd = false; // string -> boolean /* Deze wijzigingen van datatype zijn toegestaan bij dynamisch getypeerde talen (PHP in dit geval). Bij statisch getypeerde talen (bijvoorbeeld Processing) is dat niet toegestaan. */ // Werken met constanten define("PI", "3.15"); define('PI2', '3.1415');

Ze zijn ook superflexibel. Je kan er tekst (strings), getallen (hele en decimale, ofwel integers en floats), true/false (boolean) en andere soorten gegevens in opslaan, zonder dat PHP dat erg vindt. PHP zoekt zelf uit wat voor een type een waarde heeft. (Overigens, vanaf PHP 7 kan je types wel specificeren.)

Handige functies voor tijdens het ontwikkelen (debuggen) zijn:

  • gettype($var) om het type van een variabele te achterhalen
  • var_dump($var) om het type en de waarde van een variabele te beschrijven als string met een HTML-fragment.

⚠️ Bovenstaande functies horen niet thuis in de broncode van een softwaresysteem dat in bedrijf is, oftewel buiten de ontwikkeling! var_dump genereert bijvoorbeeld ongeldige/verouderde HTML-broncode. Ook kan de aanroep van dit soort functies aanvallers helpen door onnodig interne informatie prijs te geven.

Handige functies om datatypes om te zetten zijn:

  • is_numeric() om te controleren of een waarde een getal is.
  • round() om een getal met decimalen af te ronden.
  • floor() om een getal met decimalen altijd naar het laagste dichtstbijzijnde gehele getal af te ronden.
  • ceil() om een getal met decimalen altijd naar het hoogste dichtstbijzijnde gehele getal af te ronden.
  • number_format() om een getal om te zetten naar een optimaal leesbare string.
  • intval() om een string naar een int om te zetten. 💣 Tricky!
  • floatval() om een string naar float om te zetten. 💣 Tricky!

Strings

Alles wat op een HTML-pagina moet komen te staan wordt vanuit PHP als tekst = string opgeleverd. In HTML-broncode staat dus alleen maar tekst.

Om het werken met strings een beetje makkelijker te maken zijn er handige opties.

Aanhalingstekens

Gebruik enkelvoudige aanhalingstekens, tenzij je wilt dat variabelen worden vervangen binnen de string.

$naam = 'Marie'; $bericht = "Dag $naam!";

Laat omsluitende aanhalingstekens afwijken van interne technische aanhalingstekens zoals " en ' binnen een string, omdat anders de interne op iedere positie waar ze voorkomen speciaal behandeld (geëscapet) moeten worden. Dus schrijf bijvoorbeeld wel:

$bedrijf = "In PHP is dit een string: 'string'."; $html = '<img src="foto.jpg" alt="">';

Maar gebruik je aanhalingstekens voor leestekst, gebruik dan geen technische maar typografische aanhalingstekens:

$artikels = 'video’s'; $verhaal = "De parkeerwachter zei: “Gaat u, a.u.b …”."; $pad = "Pietje ging dat wel even ‘regelen’ …";

Je kan in de resterende gevallen desnoods een escape-teken '\' gebruiken om ervoor te zorgen dat PHP het teken daarachter letterlijk overneemt, en niet als eindemarkering van de string ziet.

$pad = "C:\\Users\\Jan\\Documenten";

Variabelen tussenvoegen

Teksten en variabelen kunnen met een punt aan elkaar worden gekoppeld of bij dubbele aanhalingstekens gewoon ertussen gevoegd worden. Dus let op dat er wel een klein verschil in functie is tussen het gebruik van ' en ". Als je geen variabelen tussenvoegt in een string, gebruik dan ook geen " maar '-tekens.

echo 'Dit zijn ' . $artikels . ' van ' . $naam; echo "Dit zijn $artikels van $naam";

Functies in PHP

Functies vormen de hoeksteen van gestructureerd programmeren. Ook in PHP.

Om mooie herbruikbare stukjes broncode te krijgen die we kunnen gebruiken voor onze website kunnen we dus ook functies gebruiken om HTML-broncode terug te krijgen van PHP.

<?php $naam = "Meron"; // We kunnen dit direct invullen. $html ="<h1>{$naam}</h1>"; // Maar we kunnen ook een functie definiëren die we vaker kunnen gebruiken. function titel($titelTekst) { return "<h1>{$titelTekst}</h1>"; } // We plakken nu het resultaat van de functie titel aan de variabele $html // en slaan dit op in de variabele $html $html = $html . titel($naam); ?> <!DOCTYPE html> <html> <body> <?=$html?> </body> </html>

Werken met strings (~ 30 min.)

In PHP zijn er verscheidene manieren om strings aan elkaar te plakken, ook wel concatenatie genoemd (Engels: concatenate/concatenation). Anders dan in Java gebeurt dat niet met een + maar met een .

echo 'Dit zijn ' . $artikelen . ' van ' . $naam; echo "Dit zijn $artikelen van $naam"; echo "Dit zijn {$artikelen} van {$naam}";

Hier boven valt het op dat er drie verschillende manieren genoemd worden.

  • Met enkele quotes,
  • met dubbele quotes,
  • en dubbele quotes met accolades.

Ga na of ze hetzelfde werken in jouw programmeeromgeving.

Stringfuncties

Omdat strings zo’n belangrijke rol spelen zijn er tal van ingebouwde stringfuncties. Op PHP.NET - Strings kan je ze allemaal vinden en er details over lezen.

Een paar belangrijke zijn:

Probeer de volgende broncode om het resultaat van deze functies te zien.

$tekst = '<h1>PHP - Hoofdstuk 1</h1>'; echo $tekst . '<br>'; echo strlen($tekst) . '<br>'; echo strtoupper($tekst) . '<br>'; echo strip_tags($tekst) . '<br>';

Lange teksten of meerdere regels

Als je meerdere regels in een string wilt opslaan dan kun je dat doen met:

$mijnTekst = <<<EOT Hier komt nu een enorm lange tekst over allemaal dingen die stopt als de bovenstaande karakters worden aangeroepen zoals hieronder: EOT; // Hier is de string dus gestopt.

Hieronder staan strlen en substr kort uitgelegd. Probeer zelf uit te zoeken wat strtoupper, strip_tags en strtolower doen.

strlen

Je ziet dat bij de strlen documentatie deze regel staat.

strlen( string $string ) : int

Dit betekent dat deze functie één parameter verwacht van het type string en hier genoemd $string. Het antwoord van deze functie is een int.

Probeer dat uit in je eigen PHP-omgeving.

// In het volgende voorbeeld begin je niet een string met " of ' maar met <<<EOD. // Deze eindigt vervolgens ook weer met EOD, wat staat voor END OF DEFINITION. // Je geeft eigenlijk aan dat je hier een string wilt die over meerdere regels doorgaat. $campert = <<<EOD Verzet begint niet met grote woorden maar met kleine daden zoals storm met zacht geritsel in de tuin of de kat die de kolder in zijn kop krijgt zoals brede rivieren met een kleine bron verscholen in het woud zoals een vuurzee met dezelfde lucifer die een sigaret aansteekt zoals liefde met een blik een aanraking iets wat je opvalt in een stem jezelf een vraag stellen daarmee begint verzet en dan die vraag aan een ander stellen. EOD; echo strlen($campert);

substr

Bij de documentatie van substr zie je veel meer informatie staan.

substr ( string $string , int $start [, int $length ] ) : string

In de beschrijving staat: [, int $length]. Dit betekent dat deze parameter optioneel is, en de functie dus ook zou kunnen werken met twee parameters, in plaats van drie.

Probeer de voorbeelden uit.

PHP en HTML-broncode scheiden

Voor het echte werk proberen we PHP en HTML-broncode zo veel mogelijk te scheiden. Dit doen we door bovenaan eerst de PHP uit te werken en dan pas met het HTML document te beginnen. Binnen de HTML-broncode hoeft dan alleen af en toe een PHP echo te verschijnen om de boven gegenereerde tekst ertussen te plakken.

Voor een pure echo is er ook een verkorte versie. Hierbij moet je de variabele dan zonder spaties inzetten.

<?=$variabele?>

<?php $eenVariabele = <<<EOD Dit is een interessant stuk tekst, maar let vooral op de body van het volgende stuk html." EOD; ?> <!DOCTYPE html> <html lang="nl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP-voorbeeld</title> </head> <body> <p><?=$eenVariabele?></p> </body> </html>