Informatique · PHP

Les bases de PHP

Une boutique en ligne, un horaire de classe, un formulaire d'inscription : le serveur fabrique ces pages à la demande. Il lit des données, décide quoi afficher, puis envoie du HTML au navigateur. PHP sert à écrire ce travail côté serveur ; en octobre 2026, il est utilisé par 69,8 % des sites web dont le langage côté serveur est connu.6

page.php <h1>Bonjour <?= $prenom ?> </h1> serveur PHP exécute navigateur Bonjour Léa HTML seul
Si tu affiches la source d'une page PHP dans ton navigateur, est-ce que tu verras son code PHP ? Garde ta réponse en tête : la scène 1 y répond.

Après cette fiche, tu sais

  • expliquer ce que PHP fait sur le serveur et ce que le navigateur reçoit ;
  • manipuler variables, types et chaînes, et comparer sans tomber dans les pièges de == ;
  • écrire des conditions (if, match) et des boucles (for, while, foreach) ;
  • afficher une saisie de formulaire sans faille XSS, grâce à htmlspecialchars().
1Notion 1 · Côté serveur

Le serveur exécute, le navigateur reçoit du HTML

PHP, acronyme récursif de « PHP: Hypertext Preprocessor », est un langage de script libre, pensé pour le web, qu'on peut mêler au HTML.1 Rasmus Lerdorf l'a créé en 1994 sous le nom de « Personal Home Page Tools » ; le nom actuel date de PHP 3, en 1998.1

Ce qui le distingue de JavaScript dans le navigateur : le code PHP s'exécute sur le serveur, qui produit du HTML et l'envoie. Le navigateur reçoit ce résultat, jamais le code.1

page.phpPHP
<?php
$prenom = 'Léa';
$cours = 3;
?>
<!DOCTYPE html>
<html lang="fr">
<body>
    <h1>Bonjour <?= $prenom ?></h1>
    <p>Tu as <?= $cours ?> cours aujourd'hui.</p>
</body>
</html>
<!DOCTYPE html>
<html lang="fr">
<body>
    <h1>Bonjour Léa</h1>
    <p>Tu as 3 cours aujourd'hui.</p>
</body>
</html>
<?php … ?>

Délimitent le code PHP. Ce qui est hors de ces balises est envoyé tel quel au navigateur.1

<?= … ?>

Raccourci de <?php echo … ?> : affiche la valeur d'une expression à cet endroit du HTML.1

Point-virgule

Chaque instruction se termine par ;. La balise fermante ?> en tient lieu pour la dernière ligne d'un bloc.1

Fichier tout en PHP

On omet le ?> final : un espace ou un retour à la ligne oublié après lui serait envoyé au navigateur.1

Scène 1

Le voyage d'une page PHP

Fais défiler : le navigateur demande page.php, le serveur exécute ses îlots de PHP, puis renvoie du HTML.

Scène 1 · Requête et réponse

Le navigateur demande la page

navigateur localhost/page.php requête réponse serveur : page.php rien d'affiché $prenom = 'Léa' · $cours = 3

Réponse à ma question : non. « Afficher la source » montre le HTML reçu ; le code PHP, lui, n'a jamais quitté le serveur.
Pour essayer sur ton ordinateurPHP contient un petit serveur de développement : dans le dossier du projet, php -S localhost:8000, puis ouvre localhost:8000/page.php. Il sert à apprendre et à tester, jamais à publier un site sur Internet.1
2Notion 2 · Variables et types

Une variable prend le type de sa valeur

Une variable s'écrit avec un $ suivi de son nom, qui commence par une lettre ou un _. Le nom est sensible à la casse : $note et $Note sont deux variables.2 PHP n'exige aucune déclaration de type : le type d'une variable est celui de la valeur qu'elle contient, et il change si la valeur change.2

Les types de basePHP
<?php
$prenom  = 'Noah';     // string : du texte
$age     = 17;         // int : un entier
$moyenne = 5.25;       // float : un nombre à virgule
$admis   = true;       // bool : vrai ou faux
$notes   = [5, 5.5];   // array : un tableau
$absent  = null;       // null : aucune valeur

var_dump($age);
$age = '17 ans';
var_dump($age);
int(17)
string(6) "17 ans"
Scène 2

Une variable, plusieurs types

Fais défiler : la même variable reçoit cinq valeurs de cinq types, puis PHP convertit, ou refuse de convertir.

Scène 2 · Types

Un entier

$x types pris par $x

var_dump()

Affiche le type et la valeur d'une expression : l'outil de base pour comprendre ce que contient une variable.

Conversion automatique

Dans un calcul, une chaîne numérique comme '5' est convertie en nombre. Depuis PHP 8, une chaîne qu'on ne peut pas interpréter comme un nombre lève une TypeError.2

Piège : + additionne, le point concatène

'5' + 3 vaut l'entier 8, mais '5' . 3 vaut la chaîne '53'. Le + ne colle jamais deux chaînes.2

Les chaînes : guillemets simples ou doubles

Entre guillemets doubles, les variables sont remplacées par leur valeur ; entre guillemets simples, tout est pris à la lettre. Le point . colle deux chaînes et .= ajoute à la fin d'une variable.2

Afficher du textePHP
<?php
$prenom = 'Noah';
echo "Bonjour $prenom\n";          // la variable est remplacée
echo 'Bonjour $prenom\n';          // tout est pris à la lettre
echo "\n";
echo 'Bonjour ' . $prenom . "\n";  // le point colle les chaînes
$message = 'Note : ';
$message .= 5.5;                   // .= ajoute à la fin
echo $message;
Bonjour Noah
Bonjour $prenom\n
Bonjour Noah
Note : 5.5
Piège : le caractère collé à la variable

Un nom de variable peut contenir des lettres accentuées et d'autres caractères non ASCII.2 Dans "$n… ", PHP lit donc la variable $n…, qui n'existe pas : Warning: Undefined variable $n…. Les accolades délimitent le nom : "{$n}… ".

Exercice · à toi

Que va afficher ce code ?

Quatre lignes courtes, toutes exécutées avec PHP 8.4. Lis-les comme le ferait PHP.

3Notion 3 · Comparer

== ou === : comparer sans se faire piéger

== compare deux valeurs après conversion de type ; === exige la même valeur et le même type. Deux chaînes numériques, ou un nombre et une chaîne numérique, sont comparés comme des nombres.3

Égal ou identiquePHP
<?php
var_dump('5' == 5);      // même valeur après conversion
var_dump('5' === 5);     // string contre int
var_dump(0 == 'a');      // PHP 8 : false (PHP 7 : true)
var_dump(null == false); // les deux convertis en booléen
var_dump(1 <=> 2);       // plus petit : -1
echo $_GET['page'] ?? 'accueil';   // valeur de secours
bool(true)
bool(false)
bool(false)
bool(true)
int(-1)
accueil
Scène 3

Six comparaisons, deux opérateurs

Fais défiler : chaque ligne compare deux valeurs avec == puis avec ===.

Scène 3 · == et ===

Égal ou identique ?

$a$b=====

=== et !==

Identique, non identique : valeur et type. Le choix par défaut.3

== et !=

Égal, différent, après conversion de type : à réserver aux cas où on sait pourquoi.3

<=> (vaisseau spatial)

Renvoie un entier négatif, nul ou positif selon que la gauche est plus petite, égale ou plus grande : pratique pour trier.3

??

Renvoie la valeur de gauche si elle existe et n'est pas null, sinon celle de droite, sans avertissement : idéal pour $_GET.3

PHP 7, PHP 8Avant PHP 8, une chaîne comparée à un nombre était convertie en nombre : 0 == 'a' valait true. Depuis PHP 8, c'est le nombre qui est converti en chaîne : false. Un ancien code peut donc changer de comportement après une mise à jour.3
Exercice · classer

true ou false ?

Neuf comparaisons, toutes testées avec PHP 8.4. Range chacune selon son résultat.

4Notion 4 · Conditions

if, match, switch : choisir

if teste ses conditions dans l'ordre ; elseif ajoute un test, else attrape le reste. Une mention suisse selon la note :

if, elseif, elsePHP
<?php
$note = 4.5;
if ($note >= 5.5) {
    $mention = 'très bien';
} elseif ($note >= 5) {
    $mention = 'bien';
} elseif ($note >= 4) {
    $mention = 'suffisant';
} else {
    $mention = 'insuffisant';
}
echo "Note $note : $mention";
Note 4.5 : suffisant

match (PHP 8) compare une valeur à des branches avec === et renvoie le résultat de la branche choisie ; plusieurs valeurs se séparent par des virgules.3

matchPHP
<?php
$jour = 'samedi';
$type = match ($jour) {
    'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi' => 'jour de cours',
    'samedi', 'dimanche' => 'week-end',
    default => 'jour inconnu',
};
echo $type;
week-end

Le switch, plus ancien, compare avec == et exécute les instructions jusqu'au premier break. Fais défiler : un break oublié.3

sortie
Étape 1 sur 5 · le test

$jour vaut 'samedi'. Le switch compare cette valeur à chaque case, de haut en bas.

Étape 2 sur 5 · le case trouvé

case 'samedi' correspond : PHP commence à exécuter les instructions. Il affiche repos.3

Étape 3 sur 5 · la chute

Pas de break : PHP continue dans le case suivant, sans tester 'lundi'. Il affiche aussi cours.3

Étape 4 sur 5 · le break

break fait sortir du switch : le default n'est pas exécuté. Sortie : repos cours, sans doute pas ce qu'on voulait.

Étape 5 sur 5 · avec match

Avec match, une seule branche s'exécute, comparée avec ===, et sa valeur est renvoyée : aucun break à oublier. Sortie : repos.3

switchmatch
Comparaisonsouple, ==stricte, ===
Valeur renvoyéenonoui
Sans breakcontinue dans le case suivantune seule branche, jamais de chute
Aucun cas trouvérien ne s'exécuteUnhandledMatchError, sauf avec default
Piège : = au lieu de ==

if ($note = 4) ne compare rien : il range 4 dans $note, et la condition vaut alors 4, donc vrai. Le test réussit toujours, et la note est écrasée.

5Notion 5 · Boucles

for, while, foreach : répéter

foreach parcourt un tableau élément par élément : à chaque tour, la valeur courante est rangée dans la variable choisie, et la clé aussi si on écrit $cle => $valeur.3

La moyenne de quatre notesPHP
<?php
$notes = [5, 4.5, 6, 3.5];
$somme = 0;
foreach ($notes as $note) {
    $somme += $note;
}
$moyenne = $somme / count($notes);
echo "Moyenne : $moyenne";
Moyenne : 4.75
Scène 4

foreach, tour après tour

Fais défiler : la boucle visite les quatre notes, la somme grandit, puis la moyenne tombe.

Scène 4 · foreach

Avant la boucle

$notes

for et whilePHP
<?php
for ($i = 1; $i <= 5; $i++) {     // départ ; condition ; pas
    echo $i;
}
echo "\n";
$n = 3;
while ($n > 0) {                  // tant que la condition est vraie
    echo "{$n} ";
    $n--;
}
echo "partez !";
12345
3 2 1 partez !
for

Quand on connaît le nombre de tours : départ, condition, pas, dans la parenthèse.

while

Tant que la condition est vraie. Elle est testée avant chaque tour.

foreach

Pour parcourir un tableau, sans gérer d'indice : foreach ($t as $v) ou foreach ($t as $k => $v).3

break et continue

break quitte la boucle ; continue passe directement au tour suivant.

Piège : la boucle qui ne s'arrête jamais

Sans $n--, la condition $n > 0 reste vraie pour toujours : le script tourne jusqu'à ce que PHP l'interrompe. Dans un while, quelque chose doit faire évoluer la condition.

Exercice · remettre dans l'ordre

Reconstruis le calcul de la moyenne

Six lignes mélangées : remets-les dans un ordre qui affiche la moyenne des notes.

6Notion 6 · Formulaires

Afficher une saisie sans ouvrir de faille

Les valeurs d'un formulaire arrivent dans les tableaux $_GET (dans l'URL) et $_POST. Elles viennent du visiteur : il peut y glisser du HTML, et même un <script>. Si la page les affiche telles quelles, le navigateur exécute ce code : c'est une faille XSS (cross-site scripting).5

La parade, au moment d'afficher : htmlspecialchars() convertit &, ", ', < et > en entités HTML. Le navigateur montre alors ces caractères au lieu de les interpréter.4

bonjour.php?prenom=…PHP
<?php
$prenom = filter_input(INPUT_GET, 'prenom') ?? '';
$prenom = trim($prenom);
?>
<!DOCTYPE html>
<html lang="fr">
<body>
<?php if ($prenom === ''): ?>
    <p>Indique ton prénom.</p>
<?php else: ?>
    <p>Bonjour <?= htmlspecialchars($prenom) ?> !</p>
<?php endif; ?>
</body>
</html>
<!DOCTYPE html>
<html lang="fr">
<body>
    <p>Bonjour &lt;script&gt;alert(&#039;XSS&#039;)&lt;/script&gt; !</p>
</body>
</html>

La sortie ci-dessus est celle de l'adresse bonjour.php?prenom=<script>alert('XSS')</script>.

filter_input()

Lit une variable externe par son nom (ici dans l'URL) ; elle renvoie null si la variable est absente.4

htmlspecialchars()

Par défaut depuis PHP 8.1, elle convertit aussi l'apostrophe (&#039;) et travaille en UTF-8.4

if (…): … endif;

Syntaxe alternative des structures de contrôle : les deux-points et endif remplacent les accolades, pratique au milieu du HTML.3

trim()

Retire les espaces au début et à la fin : une saisie faite seulement d'espaces devient une chaîne vide.

Scène 5

Le même prénom, deux affichages

Fais défiler : d'abord la saisie affichée telle quelle, puis passée par htmlspecialchars(), caractère après caractère.

Scène 5 · XSS

Sans échappement

saisie du champ prenom <script>alert('XSS')</script> PHP envoie navigateur

Piège : échapper au mauvais moment

On échappe à l'affichage, au dernier moment, avec la fonction qui convient à l'endroit : htmlspecialchars() pour du HTML. Pour envoyer une saisie à une base de données, ce sont les requêtes préparées qui protègent : elles sont présentées dans la fiche sur la POO en PHP.

Prends le réflexe : chaque fois qu'une donnée qui vient de l'extérieur finit dans du HTML, elle passe par htmlspecialchars(). Même un prénom.
Exercice · choisir

Sans faille ?

Deux questions sur l'affichage d'une saisie.

Habitudes de pro

Sept bonnes pratiques

  • comparer avec === et !== par défaut ;
  • passer par htmlspecialchars() toute donnée externe affichée dans du HTML ;
  • vérifier les saisies avant de s'en servir : présence (??, filter_input()), espaces (trim()), valeurs attendues ;
  • préférer match à switch : comparaison stricte, pas de break à oublier ;
  • écrire {$variable} dans une chaîne quand un caractère suit le nom ;
  • omettre le ?> final dans les fichiers qui ne contiennent que du PHP ;
  • lire les Warning au lieu de les ignorer : ils signalent souvent une variable mal nommée.
Entraînement

Trois exercices corrigés

Tous les corrigés ont été exécutés avec PHP 8.4.

1Affiche les nombres de 1 à 10, chacun suivi de « pair » ou « impair ».Voir le corrigé
<?php
for ($i = 1; $i <= 10; $i++) {
    $sorte = $i % 2 === 0 ? 'pair' : 'impair';
    echo "$i $sorte\n";
}
1 impair
2 pair
3 impair
4 pair
5 impair
6 pair
7 impair
8 pair
9 impair
10 pair

% donne le reste de la division : 0 pour un nombre pair. L'opérateur ? : choisit entre deux valeurs.

2Calcule la moyenne des notes 5, 4.5, 6 et 3.5, puis affiche la mention avec match.Voir le corrigé
<?php
$notes = [5, 4.5, 6, 3.5];
$somme = 0;
foreach ($notes as $note) {
    $somme += $note;
}
$moyenne = $somme / count($notes);
$mention = match (true) {
    $moyenne >= 5.5 => 'très bien',
    $moyenne >= 5 => 'bien',
    $moyenne >= 4 => 'suffisant',
    default => 'insuffisant',
};
echo "Moyenne $moyenne : $mention";
Moyenne 4.75 : suffisant

match (true) exécute la première branche dont la condition vaut exactement true : on y range les tests du plus exigeant au moins exigeant, comme avec if.

3Ce code devrait afficher « Bonjour Zoé » seulement si la note vaut 4. Il contient deux erreurs : trouve-les.Voir le corrigé
<?php
$prenom = 'Zoé';
$note = 3;
if ($note = 4) {
    echo 'Bonjour $prenom';
}
Bonjour $prenom

1) $note = 4 affecte au lieu de comparer : la condition est toujours vraie. Il faut ===. 2) Entre guillemets simples, $prenom n'est pas remplacé. Version corrigée, qui n'affiche rien puisque la note vaut 3 :

<?php
$prenom = 'Zoé';
$note = 3;
if ($note === 4) {
    echo "Bonjour $prenom";
}
À retenir

La fiche en huit lignes

ServeurPHP s'exécute sur le serveur ; le navigateur reçoit le HTML produit, jamais le code.
Balises<?php … ?> pour le code, <?= … ?> pour afficher une valeur ; pas de ?> final dans un fichier tout en PHP.
Variables$nom, sensible à la casse ; le type suit la valeur (int, float, string, bool, array, null).
Chaînes"…" remplace les variables, '…' non ; le point concatène, + additionne.
Comparer=== par défaut ; == convertit les types ; depuis PHP 8, 0 == 'a' vaut false.
Conditionsif / elseif / else ; match compare avec ===, renvoie une valeur, sans break.
Bouclesfor pour compter, while tant que, foreach pour les tableaux.
Affichagetoute donnée externe affichée dans du HTML passe par htmlspecialchars().
Dernière étape : le quiz. Douze questions tirées au hasard, différentes à chaque partie. Si tu te trompes, lis bien l'explication.
Quiz final

Teste-toi

Sources

  1. The PHP Group, PHP Manual : « What is PHP? », « History of PHP », « PHP tags », « Instruction separation », « Built-in web server », et la page des versions maintenues (8.2 à 8.5 en octobre 2026). introduction, histoire, balises, point-virgule, serveur intégré, versions (php.net)
  2. The PHP Group, PHP Manual : « Variables : Basics », « Type Juggling », « Strings », « String Operators ». variables, conversions, chaînes, concaténation (php.net)
  3. The PHP Group, PHP Manual : « Comparison Operators » (dont le changement de PHP 8 et l'opérateur ??), « match », « switch », « foreach », « Alternative syntax for control structures ». comparaisons, match, switch, foreach, syntaxe alternative (php.net)
  4. The PHP Group, PHP Manual : « htmlspecialchars », « filter_input ». htmlspecialchars, filter_input (php.net)
  5. OWASP, Cross Site Scripting Prevention Cheat Sheet (encodage des données à l'affichage). cheatsheetseries.owasp.org
  6. W3Techs, Usage statistics of PHP for websites, octobre 2026 (69,8 % des sites dont le langage côté serveur est connu). w3techs.com

Fiche écrite et sourcée en octobre 2026. Tout le code a été exécuté avec PHP 8.4.

Glisser pour continuer vers Fonctions et tableaux en PHP
Collège 2