Partie 1 : PHP
------------------------------------------------------------------------------------------------------------------------
Exercice : Variables et types de données
1. Créez un fichier exercice2.php.
2. Déclarez plusieurs variables de différents types (chaîne de caractères, entier, nombre à
virgule, booléen).
3. Affichez la valeur de chaque variable et son type.
4. Essayez de convertir (caster) l’une des variables d’un type à un autre puis affichez à
nouveau sa valeur et son type.
Exercice : Tableaux (array)
1. Dans Table.php, créez un tableau (array) qui contient au moins 5 prénoms.
2. Affichez tous les prénoms à l’aide d’une boucle <code>foreach</code>.
3. Affichez la taille du tableau (nombre d’éléments).
4. Supprimez le dernier prénom et réaffichez le tableau pour vérifier la suppression.
Exercice :
Soit le tableau ci-dessous :
$villeB = Array (
Array("Saint Brieuc","Dinan","Lannion") ;
Array("Quimper","Brest","Morlaix") ;
Array("Rennes","SaintMalo","Redon") ;
Array("Lorient","Vannes","Pontivy") ;
);
1- Qu'est-ce qu'affiche ?
• echo $villeB[1][2] ;
• echo $villeB[3][1] ;
• echo $villeB[4][2] ;
2- Si on rajoute Guingamp aux villes de la première liste, écrire la ligne permettant de l'afficher
avec echo
Exercice :
Soit le tableau suivant :
$tabVille[0]="Lannion" ;
$tabVille[1]="Guingamp" ;
$tabVille[3]="Morlaix" ;
$tabVille[4]="Brest" ;
Soit le programme suivant :
for($i=0;$i<count($tabVille);$i++){
1/5
echo $tabVille[$i] ;
}
D'après vous quels sont les problèmes rencontrés ?
Exercice :
1- Compléter le code ci-dessous en utilisant for et isset pour afficher le tableau complet même si les
cellules ne sont pas contiguës :
<?php
require 'header.php';
$tabVille[0] = "Lannion";
$tabVille[1] = "Guingamp";
$tabVille[3] = "Morlaix";
$tabVille[4] = "Brest";
$tabVille[10]= "Rennes";
…..
?>
2- Écrire le programme de l'exercice précédent avec foreach().
Exercice :
Soit le formulaire ci-dessous :
<form method="post" action="index.php">
Nom :<input type="text" name="nom"><br>
Prénom :<input type="text" name="prenom"><br>
signature:<textarea name="signature"></textarea><br>
Langue:<input type="radio" name="lg" value="fr">fr
<input type="radio" name="lg" value="en">en<br>
<input type="submit" value="Envoyer">
</form>
Écrire la boucle d'index.php qui affichera la saisie complète en indiquant les champs et leur valeurs.
Exercice : Formulaire (méthode GET ou POST)
1. Dans ex_form.php, créez un formulaire HTML simple avec un champ de texte pour saisir un
prénom et un bouton « Envoyer ».
2. Dans ex_traitement.php, récupérez le prénom saisi via $_GET ou $_POST (selon la
méthode choisie).
3. Affichez un message personnalisés du style « Bonjour, [prénom] ! ».
4. Testez le formulaire en saisissant plusieurs prénoms différents.
Exercice : Fichiers (écriture/lecture)
1. Dans ex_file.php, écrivez un script qui ouvre un fichier texte (ex. donnees.txt).
2. Écrivez plusieurs lignes de texte dedans.
3. Fermez le fichier.
4. Ré-ouvrez le même fichier en mode lecture, lisez tout le contenu et affichez-le à l’écran.
5. Gérez un éventuel message d’erreur si le fichier n’existe pas ou ne peut pas être lu.
Exercice : Getters, Setters & Encapsulation
1. Reprenez la classe Personne étudiée dans le cours.
2/5
2. Ajoutez une méthode publique setNom($nouveauNom) qui permet de changer la valeur de
$nom tout en empêchant les noms vides ou trop courts (par exemple, moins de 2 caractères).
3. Testez la modification du nom :
◦ Essayez un nom normal (ex. « Ahmed »).
◦ Essayez un nom vide ou trop court. Dans ce cas, ne modifiez pas la propriété et affichez
un message d’erreur.
Exercice : Classes abstraites
1. Créez une classe abstraite Forme :
◦ Propriété protégée $couleur.
◦ Constructeur qui assigne la couleur.
◦ Méthode abstraite aire() (pas de corps).
◦ Méthode concrète getCouleur() qui retourne la couleur.
2. Créez deux classes concrètes Cercle et Rectangle qui héritent de Forme :
◦ Cercle : propriété $rayon, implémente aire() = π × rayon².
◦ Rectangle : propriétés $longueur, $largeur, implémente aire() = longueur × largeur.
3. Dans un script, instanciez un Cercle et un Rectangle, affichez leur couleur et leur aire.
Note : Vous ne pouvez pas faire new Forme(...) car Forme est abstraite.
Exercice : Méthodes magiques (Exemple avec __toString())
1. Créez une classe Livre avec :
◦ Propriétés privées : $titre, $auteur.
◦ Constructeur pour initialiser ces propriétés.
2. Implémentez la méthode magique __toString() pour retourner une chaîne du style : « Titre :
[titre], Auteur : [auteur] ».
3. Instanciez un Livre, par exemple new Livre("1984", "George Orwell").
4. Faites un echo de l’objet et observez le résultat.
Partie 2 : Framework MVC
------------------------------------------------------------------------------------------------------------------------
Étape 1 : Mettre en place la structure de dossiers
But : Créer un squelette de projet avec une structure MVC minimale.
Tâches :
• Créez un dossier principal (ex. MonProjetMVC).
• À l’intérieur, créez 3 sous-dossiers :
models/ (pour les classes du modèle),
views/ (pour les fichiers d’affichage),
controllers/ (pour les contrôleurs).
• Créez un fichier index.php à la racine, qui servira de point d’entrée (front controller).
• Créez un fichier .htaccess (si vous êtes sur Apache) pour réécrire les URL et tout rediriger
vers index.php.
Étape 2 : Système de routage basique
But : Diriger une requête vers le bon contrôleur et la bonne action (méthode).
Tâches :
• Dans index.php, récupérez la route depuis l’URL, par exemple via $_GET['url'] ou un
paramètre controller/action.
3/5
• En fonction de cette route, appelez un contrôleur (fichier dans controllers/) et une méthode
correspondante.
Exemples de routes :
index.php?controller=home&action=index
index.php?controller=user&action=list
• Créez un contrôleur simple, HomeController.php, avec une méthode index() qui affiche (par
un simple echo) “Bienvenue !”.
Étape 3 : Premier modèle et interaction avec la base de données
But : Introduire un Model qui interagit avec une base de données.
Tâches :
• Configurez une connexion à la base de données (via PDO, par exemple).
• Créez un fichier models/Database.php qui gère la création d’une instance PDO (Singleton
ou simple fonction).
• Créez un modèle models/User.php (une classe User ou UserModel) avec une méthode
getAllUsers() qui retourne la liste des utilisateurs depuis la table users.
• Dans votre UserController.php, créez une méthode list() qui : Instancie (ou récupère) le
modèle User.
• Appelle la méthode getAllUsers().
• Affiche le résultat (pour l’instant, par un var_dump, ou en le passant à la vue).
Étape 4 : Vue (HTML) et passage de données
But : Séparer clairement l’affichage (HTML) de la logique (contrôleur).
Tâches :
• Créez un fichier de vue views/user/list.php.
• Dans votre UserController::list(), après avoir récupéré la liste des utilisateurs, incluez cette
vue et passez-lui les données (par exemple via une variable $users).
• Dans la vue, affichez un tableau HTML listant les utilisateurs.
Etape 5 : Créer (Create) un utilisateur (Formulaire + Contrôleur)
But : Implémenter la partie C du CRUD (Create).
Tâches :
• Ajoutez dans UserController une méthode create().
• Si la requête n’est pas encore soumise (GET), affichez un formulaire (vue
views/user/create.php).
• Si la requête est soumise (POST), récupérez les champs (ex. nom, email), appelez la
méthode createUser() de votre UserModel.
• Après l’insertion en BDD, redirigez l’utilisateur vers la liste des utilisateurs ou affichez un
message de succès.
Étape 6 : Modifier (Update) et supprimer (Delete) un utilisateur
But : Compléter le CRUD (Update & Delete).
Tâches :
• Update :
◦ Dans UserController, méthode edit($id).
◦ Récupérez l’utilisateur concerné (via une méthode getUserById($id) dans le modèle).
◦ Affichez un formulaire pré-rempli.
4/5
◦ Si le formulaire est soumis, appelez une méthode updateUser($id, $nom, $email).
• Delete :
◦ Dans UserController, méthode delete($id).
◦ Appelez deleteUser($id) dans le modèle.
◦ Redirigez ou affichez un message de confirmation.
Étape 7 : Organisation avancée des vues (layouts, … )
But : Réutiliser des morceaux de vue (en-tête, pied de page…) et mettre en place un layout global.
Tâches :
• Créez un layout global views/layout.php qui contient la structure HTML générale (header,
footer, menu).
• À l’intérieur de ce layout, définissez un emplacement où inclure la vue spécifique (par
exemple <?php include $content; ?>).
• Dans votre contrôleur, vous pourrez faire :
$content = 'views/user/list.php';
include 'views/layout.php';
• Mettez en place un menu de navigation pour accéder aux différentes actions (Lister
utilisateurs, Créer, etc.).
Étape 8 : Gestion des erreurs et exceptions
But : Prévoir un affichage utilisateur pour les erreurs (ex. mauvaise route, contrôleur inconnu,
exception SQL…).
Tâches :
• Gérer le cas où le contrôleur ou l’action n’existe pas (404 not found ou message d’erreur).
• Entourez les opérations critiques (ex. requêtes SQL) d’un try/catch.
• Affichez un message plus joli qu’un simple var_dump d’erreur (créez une vue
views/error.php).
• Personnalisez l’affichage des erreurs en mode production vs. Développement.
Exercice 1 : Application de l’architecture MVC pour « Mini-blog » (From scratch)
But : Mettre en pratique tout le cycle MVC dans une application plus concrète.
Tâches :
• Base de données : table articles (id, titre, contenu, date de création, etc.).
• Modèle ArticleModel avec méthodes : getAll(), getById($id), create(), update(), delete().
• Contrôleur ArticleController avec actions : index(), show($id), create(), edit($id),
delete($id).
• Vues correspondantes (liste des articles, affichage d’un article, formulaire de
création/édition).
• Mettez en place un layout global, un menu « Accueil / Nouvel article ».
• Ajoutez une gestion des erreurs (article introuvable, etc.).
Exercice 2: Application de l’architecture MVC pour « Mini-blog » avec Laravel
1. Utiliser framework Laravel, pour la création de l’application « Mini-blog » en respectant
l’architecture MVC (Exercice précédent).
2. Quelles sont vos remarques concernant la différence entre la création d'une application en
utilisant un framework MVC (from scratch) et un framework comme Laravel ?
5/5