Jusqu'à maintenant nous avons travaillé avec le terminal, mais je vous propose de voir maintenant comment PHP peut être utilisé pour créer des pages HTML dynamiques.
Un fichier index.php ne contentant que du code HTML complète produira exactement le même rendu qu'un .html statique, à la différence qu'on peut y insérer de la logique PHP pour rendre le contenu dynamique.
Structurer son projet avec header et footer
Sur un site avec plusieurs pages, beaucoup de code HTML se répète : le <head>, la navigation, le footer. Plutôt que de copier-coller ce code sur chaque page, on le sépare dans des fichiers dédiés que l'on inclut avec require.
header.php contient tout ce qui précède le contenu principal (balises <html>, <head>, navigation) et footer.php tout ce qui le suit (scripts JS, fermeture des balises). Chaque page se résume alors à l'essentiel :
Si demain on modifie la navigation, on touche uniquement header.php et toutes les pages sont mises à jour automatiquement.
Lancer un serveur de développement
Pour voir le résultat dans un navigateur sans installer Apache ou Nginx, PHP embarque un serveur web intégré. Dans le dossier du projet, on lance :
Le site est alors accessible sur http://localhost:8000. Le serveur écoute uniquement en local, il n'est pas accessible depuis l'extérieur. On l'arrête avec Ctrl+C.
Passer des variables aux fichiers inclus
Un fichier inclus avec require a accès à toutes les variables définies avant l'instruction d'inclusion. C'est pratique pour personnaliser les fichiers partagés selon la page courante. Par exemple, pour définir un titre de page dynamique dans le <title> du header :
Si la variable n'est pas toujours définie (certaines pages pourraient oublier de la déclarer), on vérifie son existence avec isset() avant de l'afficher :
La syntaxe alternative pour mélanger PHP et HTML
Quand PHP et HTML s'entremêlent, les accolades des structures de contrôle (if, for, foreach...) deviennent difficiles à lire. PHP propose une syntaxe alternative qui remplace l'accolade ouvrante par un : et l'accolade fermante par endif, endfor, endforeach, etc.
Avec accolades classiques :
Avec la syntaxe alternative :
La syntaxe alternative est plus lisible parce que endif ou endforeach indique clairement quelle structure se ferme, sans avoir à remonter visuellement à l'accolade ouvrante correspondante.
La short syntax <?=
Pour afficher une variable, on écrit souvent <?php echo $var; ?>. PHP propose une forme raccourcie : <?= $var ?>. Le point-virgule est même optionnel quand c'est la seule expression dans le bloc.
C'est particulièrement pratique dans les templates où on alterne en permanence entre HTML et affichage de variables. Cette syntaxe est supportée nativement depuis PHP 7, sans configuration particulière.
La superglobale $_SERVER
PHP met à disposition des superglobales : des tableaux préremplis accessibles depuis n'importe où dans le code, y compris à l'intérieur des fonctions, sans avoir à les passer en paramètre.
$_SERVER contient des informations sur le serveur et la requête en cours. Les clés les plus utiles :
$_SERVER['SCRIPT_NAME']: le chemin du fichier PHP en cours d'exécution (ex:/index.php)$_SERVER['REQUEST_URI']: l'URL complète demandée par le navigateur$_SERVER['REQUEST_METHOD']: la méthode HTTP utilisée (GET,POST...)$_SERVER['PHP_SELF']: le nom du fichier qui exécute le script
SCRIPT_NAME est particulièrement pratique pour savoir sur quelle page on se trouve, et ainsi gérer dynamiquement l'état actif d'un lien de navigation :
Plus besoin de passer manuellement une variable $nav dans chaque page : le header détermine lui-même quelle page est active.
Encapsuler la logique dans des fonctions
Dès qu'un bout de logique se répète dans les templates, on gagne à l'extraire dans une fonction. Par exemple, une fonction nav_item() qui génère le HTML d'un lien de navigation avec gestion automatique de la classe active :
L'appel est alors lisible et sans répétition :
Ajouter une entrée de menu ne demande qu'une ligne supplémentaire, sans toucher à la logique.
Quand une fonction doit être partagée entre plusieurs fichiers inclus (par exemple entre header.php et footer.php), on la place dans un functions.php chargé en premier :
require_once garantit que les fonctions ne sont déclarées qu'une seule fois, même si header.php et footer.php incluent tous les deux functions.php. Si on ne peut pas utiliser require_once, on peut aussi conditionner la déclaration avec function_exists() :
La syntaxe Heredoc
Construire du HTML dans une chaîne de caractères avec des guillemets simples ou doubles devient vite pénible : il faut concaténer les variables, échapper les guillemets des attributs HTML... La syntaxe Heredoc résout ce problème.
La syntaxe fonctionne ainsi :
- On ouvre avec
<<<suivi d'un identifiant arbitraire (iciHTML, mais ça pourrait être n'importe quel mot) - On écrit le contenu sur les lignes suivantes, avec interpolation de variables comme avec les guillemets doubles
- On ferme avec le même identifiant collé en début de ligne, sans indentation, suivi d'un
;
L'identifiant de fermeture ne doit pas avoir d'espace avant lui, sinon PHP ne le reconnaît pas comme la fin de l'Heredoc.
Il existe aussi la variante Nowdoc (identifiant entre guillemets simples) qui n'interprète pas les variables, l'équivalent des guillemets simples :
L'Heredoc est particulièrement utile dans les fonctions qui retournent des blocs HTML : le code reste lisible, correctement indenté, et on n'a plus à se soucier des conflits de guillemets.