Prérequis
- Niveau : bases HTML, notions de programmation utiles mais non requises.
- Outils : XAMPP (ou WAMP / MAMP / Laragon) pour Apache + PHP + MySQL en local. PHP 8.2+ recommandé en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer).
- Temps estimé : 2 h (lecture + premiers scripts).
Pourquoi apprendre PHP ?
PHP propulse environ 75 % des sites web dont le langage côté serveur est connu, selon W3Techs. WordPress, Wikipedia, Slack et de nombreux ERP/CRM sont en PHP. C’est le chemin le plus rapide pour passer de pages statiques à un vrai backend dynamique avec base de données.
PHP : le langage qui fait tourner le web
PHP fait fonctionner 79% des sites web, dont WordPress, Facebook et Wikipedia. C’est un langage côté serveur : le code PHP s’exécute sur le serveur et envoie du HTML au navigateur.
Installer PHP en local
Installez XAMPP (Windows/Mac) ou WAMP (Windows) :
- Téléchargez XAMPP depuis apachefriends.org
- Installez et lancez Apache + MySQL
- Placez vos fichiers dans
C:\xampp\htdocs\ - Accédez à
http://localhost/votre-fichier.php
Votre premier script PHP
Voici la mise en pratique pour Votre premier script PHP. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<?php
// Tout code PHP est entre <?php et ?>
echo "Bonjour depuis PHP !";
// PHP peut s'intégrer dans du HTML
?>
<!DOCTYPE html>
<html>
<body>
<h1><?php echo "Bienvenue sur mon site"; ?></h1>
<p>Il est <?= date('H:i') ?> à Dakar.</p>
<!-- <?= ... ?> est un raccourci pour <?php echo ... ?> -->
</body>
</html>
Variables et types de données
Voici la mise en pratique pour Variables et types de données. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<?php
// Les variables commencent par $
$nom = "Mamadou"; // String (texte)
$age = 25; // Integer (entier)
$prix = 15000.50; // Float (décimal)
$estEtudiant = true; // Boolean (vrai/faux)
$competences = ["HTML", "CSS", "JavaScript"]; // Array (tableau)
// Afficher une variable dans du texte
echo "Je m'appelle $nom et j'ai $age ans.";
// Résultat : Je m'appelle Mamadou et j'ai 25 ans.
// Concaténation avec le point (.)
echo "Formation : " . $competences[0] . ", " . $competences[1];
?>
Conditions (if / else)
Voici la mise en pratique pour Conditions (if / else). Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<?php
$note = 14;
if ($note >= 16) {
echo "Mention Très Bien 🏆";
} elseif ($note >= 14) {
echo "Mention Bien 👍";
} elseif ($note >= 12) {
echo "Mention Assez Bien";
} elseif ($note >= 10) {
echo "Admis";
} else {
echo "Non admis - courage pour la prochaine fois !";
}
// Opérateur ternaire (raccourci)
$statut = ($age >= 18) ? "Majeur" : "Mineur";
?>
Boucles
Voici la mise en pratique pour Boucles. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<?php
// Boucle for
for ($i = 1; $i <= 5; $i++) {
echo "Formation n°$i<br>";
}
// Boucle foreach (pour les tableaux)
$formations = ["Développement Web", "Marketing Digital", "Cybersécurité"];
foreach ($formations as $formation) {
echo "<li>$formation</li>";
}
// Avec la clé (index)
foreach ($formations as $index => $formation) {
echo ($index + 1) . ". $formation<br>";
}
// Boucle while
$compteur = 0;
while ($compteur < 3) {
echo "Tour $compteur<br>";
$compteur++;
}
?>
Fonctions
Voici la mise en pratique pour Fonctions. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
<?php
// Créer une fonction
function saluer($nom, $heure = "matin") {
if ($heure === "matin") {
return "Bonjour $nom !";
} else {
return "Bonsoir $nom !";
}
}
echo saluer("Fatou"); // Bonjour Fatou !
echo saluer("Ibrahima", "soir"); // Bonsoir Ibrahima !
// Fonction qui calcule un prix TTC (TVA Sénégal : 18%)
function prixTTC($prixHT, $tva = 0.18) {
return $prixHT * (1 + $tva);
}
echo prixTTC(10000) . " FCFA"; // 11800 FCFA
?>
Tableaux associatifs (dictionnaires)
Voici la mise en pratique pour Tableaux associatifs (dictionnaires). Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
<?php
// Tableau associatif = paires clé => valeur
$etudiant = [
"nom" => "Diallo",
"prenom" => "Mamadou",
"age" => 25,
"formation" => "Développement Web",
"competences" => ["HTML", "CSS", "PHP", "MySQL"]
];
echo $etudiant["prenom"]; // Mamadou
echo $etudiant["competences"][2]; // PHP
// Ajouter un élément
$etudiant["email"] = "mamadou@email.com";
// Parcourir
foreach ($etudiant as $cle => $valeur) {
if (is_array($valeur)) {
echo "$cle : " . implode(", ", $valeur) . "<br>";
} else {
echo "$clé : $valeur<br>";
}
}
?>
Récupérer les données d'un formulaire
Voici la mise en pratique pour Récupérer les données d'un formulaire. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
<!-- formulaire.html -->
<form action="traitement.php" method="POST">
<input type="text" name="nom" placeholder="Votre nom">
<input type="email" name="email" placeholder="Votre email">
<button type="submit">Envoyer</button>
</form>
<!-- traitement.php -->
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Récupérer et sécuriser les données
$nom = htmlspecialchars(trim($_POST['nom']));
// (Note : FILTER_SANITIZE_EMAIL est déprécié depuis PHP 8.1)
$email = trim($_POST['email']);
if (!empty($nom) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Merci $nom ! Nous vous contacterons à $email.";
} else {
echo "Données invalides.";
}
}
?>
Fonctions PHP indispensables
| Fonction | Usage | Exemple |
|---|---|---|
strlen() |
Longueur d'un texte | strlen("Dakar") → 5 |
strtolower() |
Minuscules | strtolower("DAKAR") → dakar |
explode() |
Découper un texte | explode(",", "a,b,c") → ["a","b","c"] |
implode() |
Joindre un tableau | implode("-", [2024,1,15]) → "2024-1-15" |
date() |
Date formatée | date("d/m/Y") → 15/03/2026 |
array_push() |
Ajouter au tableau | array_push($arr, "new") |
Erreurs fréquentes
« Parse error: syntax error, unexpected … »
Cause : point-virgule oublié, accolade non fermée, ou $ manquant devant une variable.
Solution : activez l'affichage des erreurs en dev : error_reporting(E_ALL); ini_set('display_errors', '1');.
Variable $_POST['nom'] qui renvoie une notice « undefined index »
Cause : on accède à une clé qui n'existe pas (formulaire vide ou champ non envoyé).
Solution : en PHP 7+ utilisez $_POST['nom'] ?? '' (opérateur de coalescence nulle).
Faille XSS : afficher du texte utilisateur sans htmlspecialchars()
Cause : echo $_POST['message'] directement → injection HTML/JS.
Solution : enveloppez TOUTE sortie utilisateur avec htmlspecialchars($var, ENT_QUOTES, 'UTF-8').
Utiliser FILTER_SANITIZE_EMAIL ou FILTER_SANITIZE_STRING
Cause : ces filtres sont dépréciés depuis PHP 8.1 (FILTER_SANITIZE_STRING) et la sanitisation d'e-mail est jugée trompeuse.
Solution : utilisez directement filter_var($email, FILTER_VALIDATE_EMAIL) pour valider, et htmlspecialchars() pour échapper à l'affichage.
Exercice pratique
🎯 Défi : Mini-application PHP
- Créez un formulaire qui demande le nom, l'âge et la formation souhaitée
- En PHP, validez les données et affichez un résumé
- Si l'âge < 16, affichez "Vous êtes trop jeune pour cette formation"
- Calculez le prix TTC (18% TVA) de la formation choisie
- Affichez le tout dans une belle carte HTML
Versions de PHP en 2026
| Version | Sortie | Fin support actif | Fin support sécurité |
|---|---|---|---|
| PHP 8.4 | nov. 2024 | déc. 2026 | déc. 2028 |
| PHP 8.3 | nov. 2023 | déc. 2025 | déc. 2027 |
Étape 2 : Environnement local moderne
- Laragon (Windows) — léger, switch PHP en un clic.
- Herd (macOS et Windows) — édité par Laravel, gratuit.
- DDEV (multiplateforme) — Docker, parfait quand l'équipe mélange Windows et Linux.
curl -fsSL https://ddev.com/install.sh | bash
mkdir mon-projet && cd mon-projet
ddev config --project-type=php --php-version=8.4
ddev start
Étape 3 : Composer
Voici la mise en pratique pour Étape 3 : Composer. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer init
composer require monolog/monolog
Étape 4 : Types modernes
Voici la mise en pratique pour Étape 4 : Types modernes. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
<?php
declare(strict_types=1);
function trouverUtilisateur(int $id): ?array { /* ... */ }
function formater(int|string $valeur): string { /* ... */ }
final readonly class Adresse {
public function __construct(
public string $rue,
public string $ville,
public string $pays = 'Sénégal',
) {}
}
class Utilisateur {
public string $nomComplet { get => $this->prenom . ' ' . $this->nom; }
public function __construct(public string $prenom, public string $nom) {}
}
Les property hooks arrivés dans PHP 8.4 remplacent élégamment les couples getNom() / setNom().
Étape 5 : Premier mini-projet
Voici la mise en pratique pour Étape 5 : Premier mini-projet. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
// public/index.php
<?php declare(strict_types=1);
require __DIR__ . '/../src/donnees.php';
?>
<!doctype html>
<html lang='fr'>
<body>
<h1>Commerçants du quartier</h1>
<ul>
<?php foreach (commercants() as $c): ?>
<li><?= htmlspecialchars($c['nom']) ?></li>
<?php endforeach; ?>
</ul>
</body>
</html>
Étape 6 : Choisir un framework
| Framework | Profil | Cas idéal |
|---|---|---|
| Laravel 11 | Tout-inclus | Application complète |
| Symfony 7 | Modulaire | API enterprise |
| Slim 4 | Microframework | API simple |
Étape 7 : Outillage qualité
Voici la mise en pratique pour Étape 7 : Outillage qualité. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l'exécuter en local.
composer require --dev phpstan/phpstan friendsofphp/php-cs-fixer pestphp/pest
vendor/bin/phpstan analyse src --level=6
vendor/bin/php-cs-fixer fix src
vendor/bin/pest
Adaptation au contexte ouest-africain : performance, équipe, marché
Pour un développeur ou une PME basée à Dakar, Abidjan, Bamako, Cotonou, Lomé, Ouagadougou, Niamey ou Conakry qui livre des sites web ou applications custom, trois adaptations pèsent sur le succès des projets. Premièrement, la connectivité 4G inégale impose de réduire le poids des pages au strict nécessaire. Deuxièmement, le profil typique des développeurs disponibles localement est majoritairement formé sur du JavaScript moderne et du PHP, avec une expertise variable sur les outils plus avancés (TypeScript, frameworks edge, design systems). Troisièmement, le coût en FCFA des services cloud doit être anticipé : Hetzner CX22 à 4 500 FCFA/mois reste imbattable pour un démarrage, Cloudflare Pages gratuit pour les sites statiques, Backblaze B2 à 6 USD/TB/mois pour les sauvegardes. Pour les projets B2C qui exigent une latence faible, héberger sur un CDN avec PoP africain (Cloudflare Lagos, Africa Data Centres) divise par trois la latence perçue par rapport à un déploiement européen sans CDN.
Tester sur appareils réels avant la mise en production
Plus important que tous les outils synthétiques, tester son site sur un Android d'entrée de gamme avec une connexion 4G locale dégradée donne le seul verdict qui compte. Galaxy A03 à 200 EUR neuf, Tecno Spark, Itel A60 sont les appareils dominants chez les visiteurs ouest-africains. Sur ces téléphones, un site qui semble rapide sur DevTools peut être laggy en réalité. Lectures complémentaires sur les patterns frontend modernes, voir aussi le guide événements JavaScript.
Erreurs courantes à éviter en production
Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d'origine. Une solution qui marche pour un cas particulier devient un bug subtil dans un autre. Deuxième pattern : ignorer les warnings de la console. Chaque warning est un signal qui mérite d'être lu et compris. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d'entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR (Architecture Decision Record) prend dix minutes et fait gagner des heures lors d'un incident ou d'un audit.
Erreurs courantes à éviter en production
Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d'origine. Une solution qui marche pour un cas particulier devient un bug subtil dans un autre. Deuxième pattern : ignorer les warnings de la console. Chaque warning est un signal qui mérite d'être lu et compris. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d'entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR (Architecture Decision Record) prend dix minutes et fait gagner des heures lors d'un incident ou d'un audit.
Pratiques avancées et outils complémentaires
Au-delà des patterns présentés, plusieurs outils et techniques complètent une maîtrise sérieuse du sujet. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit de sécurité avant chaque déploiement. Cela évite 80 % des régressions introduites par des modifications hâtives. Deuxième axe : monitorer en production avec un outil comme Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives — la plupart proposent un free tier qui suffit pour démarrer. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ du projet, avec un format simple (contexte, décision, conséquences). Cette traçabilité paie quand un nouveau membre rejoint l'équipe ou quand un audit externe demande de justifier les choix techniques.
Ressources francophones pour approfondir
Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence, intégralement traduite pour la majorité des sujets. FreeCodeCamp propose des parcours de 300+ heures avec exercices interactifs et certificat. JavaScript.info (en français : fr.javascript.info) couvre le langage en profondeur. Grafikart.fr offre des centaines de tutoriels vidéos en français de qualité. Pour la pratique, contribuer à un projet open source via GitHub est l'investissement le plus payant à moyen terme — recruteurs et clients regardent les contributions GitHub avant le CV.
Pratiques avancées et outils complémentaires
Au-delà des patterns présentés, plusieurs outils et techniques complètent une maîtrise sérieuse du sujet. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit de sécurité avant chaque déploiement. Cela évite 80 % des régressions introduites par des modifications hâtives. Deuxième axe : monitorer en production avec un outil comme Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives — la plupart proposent un free tier qui suffit pour démarrer. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ du projet, avec un format simple (contexte, décision, conséquences). Cette traçabilité paie quand un nouveau membre rejoint l'équipe ou quand un audit externe demande de justifier les choix techniques.
Ressources francophones pour approfondir
Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence, intégralement traduite pour la majorité des sujets. FreeCodeCamp propose des parcours de 300+ heures avec exercices interactifs et certificat. JavaScript.info (en français : fr.javascript.info) couvre le langage en profondeur. Grafikart.fr offre des centaines de tutoriels vidéos en français de qualité. Pour la pratique, contribuer à un projet open source via GitHub est l'investissement le plus payant à moyen terme — recruteurs et clients regardent les contributions GitHub avant le CV.
Pour explorer plus loin
- Consommer des API REST en JS
- Référence officielle : PHP — Manuel officiel
- Bonnes pratiques : PHP The Right Way
- Statistiques d'usage : W3Techs — PHP usage
- Versions supportées : PHP — Supported versions (en 2026, viser PHP 8.2+)