Développement Web

Guide complet : Introduction à PHP pour débutants

15 min de lecture

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) :

  1. Téléchargez XAMPP depuis apachefriends.org
  2. Installez et lancez Apache + MySQL
  3. Placez vos fichiers dans C:\xampp\htdocs\
  4. 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

  1. Créez un formulaire qui demande le nom, l'âge et la formation souhaitée
  2. En PHP, validez les données et affichez un résumé
  3. Si l'âge < 16, affichez "Vous êtes trop jeune pour cette formation"
  4. Calculez le prix TTC (18% TVA) de la formation choisie
  5. 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

Partager