Exercices corrigés PHP – Programmation Orientée Objet | Partie 5
Avec des exercices corrigés en PHP, vous pratiquerez divers concepts du langage de programmation PHP. Vous commencerez par des exercices PHP de base à des exercices plus avancés. La solution est fournie pour chaque exercice. Vous devez essayer de résoudre chaque problème par vous-même avant de vérifier la solution. Si vous avez des questions concernant chaque problème, nous vous encourageons à les poster sur notre forum.
Exercice 1:
Écrire un programme PHP pour créer une classe appelée « Cours » avec des attributs pour le nom du cours, l’instructeur et le nombre des étoiles. Créer une classe fille « CoursEnLigne » qui ajoute des attributs pour la plate-forme et la durée. Implémentez des méthodes pour afficher les détails du cours et vérifier si le cours est éligible pour un certificat en fonction de sa durée.
Diagrame de classe:

<?php // Définir la classe Cours class Cours { // Attributs pour le nom du cours, l'instructeur et le nombre des // étoiles private $nomCours; private $instructeur; private $etoiles; // Constructeur pour initialiser l'objet Cours public function __construct($nomCours, $instructeur, $etoiles) { $this->nomCours = $nomCours; $this->instructeur = $instructeur; $this->etoiles = $etoiles; } // Méthode pour afficher les détails du cours public function afficher() { echo "Nom du cours: " . $this->nomCours . "\n"; echo "Instructeur: " . $this->instructeur . "\n"; echo "Étoiles: " . $this->etoiles . "\n"; } // Méthode pour récupérer le nom du cours public function getNomCours() { return $this->nomCours; } // Méthode pour récupérer l'instructeur public function getInstructeur() { return $this->instructeur; } // Méthode pour récupérer le nombre des étoiles public function getEtoiles() { return $this->etoiles; } } // Définir la classe fille CoursEnLigne qui hérite de la classe Cours class CoursEnLigne extends Cours { // Attributs supplémentaires: la plate-forme et la durée private $platforme; private $d; // durée en heures // Constructeur pour initialiser l'objet CoursEnLigne public function __construct($nomCours, $instructeur, $etoiles, $platforme, $d) { // Appeler le constructeur de la classe mère parent::__construct($nomCours, $instructeur, $etoiles); $this->platforme = $platforme; $this->d = $d; } // Méthode pour afficher les détails du cours, y compris la // plate-forme et la durée public function afficher() { // Appeler la méthode de la classe mère pour afficher les // détails communs parent::afficher(); echo "Plateforme: " . $this->platforme . "\n"; echo "Durée: " . $this->d . " heures\n"; } // Méthode pour vérifier si le cours est éligible pour un // certificat en fonction de sa durée public function estEligiblePourCertificat() { // Supposons qu'un cours soit éligible pour un certificat si // sa durée est d'au moins 12 heures. return $this->d >= 12; } // Méthode pour récupérer la plateforme public function getPlatform() { return $this->platforme; } } // Créer un objet Cours $c1 = new Cours("Biologie", "Dr. Alex Leon", 3); $c1->afficher(); echo "\n"; // Créer un objet CoursEnLigne $c2 = new CoursEnLigne("Science", "Prof. Ali Farok", 5, "Coursera", 24); $c2->afficher(); echo "Éligible pour un certificat: " . ($c2->estEligiblePourCertificat() ? "Oui" : "Non") . "\n"; ?>
Sortie:
Nom du cours: Biologie Instructeur: Dr. Alex Leon Etoiles: 3 Nom du cours: Science Instructeur: Prof. Ali Farok Etoiles: 5 Platforme: Coursera Durée: 24 heures Eligible pour un certificat: true
Exercice 2:
Écrivez un programme PHP pour créer une classe appelée « ProduitElectronique » avec des attributs pour l’ID, le nom et le prix du produit. Implémentez des méthodes pour appliquer une remise et calculer le prix final. Créez une classe fille « Refrigerateur » qui ajoute un attribut de période de garantie et une méthode pour étendre la garantie.
Diagrame de classe:

<?php // Définir la classe ProduitElectronique class ProduitElectronique { // Attributs pour l'ID, le nom et le prix du produit private $produitID; private $nom; private $prix; // Constructeur pour initialiser l'objet ProduitElectronique public function __construct($produitID, $nom, $prix) { $this->produitID = $produitID; $this->nom = $nom; $this->prix = $prix; } // Méthode pour appliquer une réduction au prix du produit public function appliquerRemise($pourcentageRemise) { // Calculer le montant de la remise $montantRemise = $this->prix * $pourcentageRemise / 100; // Soustraire le montant de la remise du prix initial $this->prix -= $montantRemise; } // Méthode de calcul du prix final après remise public function getPrixFinal() { // Retourner le prix actuel qui peut avoir été réduit return $this->prix; } // Méthode pour récupérer l'ID du produit public function getProduitID() { return $this->produitID; } // Méthode pour récupérer le nom du produit public function getNom() { return $this->nom; } // Méthode pour récupérer le prix du produit public function getPrix() { return $this->prix; } } // Définir la classe fille Refrigerateur qui hérite de ProduitElectronique class Refrigerateur extends ProduitElectronique { // Attribut supplémentaire pour la période de garantie private $periodeGarantie; // en mois // Constructeur pour initialiser l'objet Refrigerateur public function __construct($produitID, $nom, $prix, $periodeGarantie) { // Appeler le constructeur de la classe mère pour initialiser // les attributs communs parent::__construct($produitID, $nom, $prix); $this->periodeGarantie = $periodeGarantie; } // Méthode pour prolonger la période de garantie public function prolongerGarantie($additionalMonths) { // Ajouter les mois supplémentaires à la période de garantie // actuelle $this->periodeGarantie += $additionalMonths; } // Méthode pour récupérer la période de garantie public function getPeriodeGarantie() { return $this->periodeGarantie; } // Surcharger la méthode d'application de remise pour inclure un // message public function appliquerRemise($pourcentageRemise) { // Appeler la méthode de la classe mère pour appliquer la // remise parent::appliquerRemise($pourcentageRemise); // Afficher un message indiquant que la réduction a été // appliquée echo "Remise appliquée au réfrigérateur: " . $this->getNom() . "\n"; } } // Créer un objet ProduitElectronique $p = new ProduitElectronique("P123", "Lave-vaisselle", 500.00); // Appliquer une réduction et afficher le prix final $p->appliquerRemise(15); echo "ID du produit: " . $p->getProduitID() . "\n"; echo "Nom: " . $p->getNom() . "\n"; echo "Prix après réduction: " . $p->getPrixFinal() . " €\n\n"; // Créer un objet Refrigerateur $r = new Refrigerateur("P789", "Réfrigérateur Samsung", 900.00, 12); // Appliquer une réduction et afficher le prix final $r->appliquerRemise(15); echo "ID du produit: " . $r->getProduitID() . "\n"; echo "Nom: " . $r->getNom() . "\n"; echo "Prix après réduction: " . $r->getPrixFinal() . " €\n"; // Afficher la période de garantie echo "Période de garantie: " . $r->getPeriodeGarantie() . " mois\n"; // Prolonger la période de garantie et afficher la nouvelle période de garantie $r->prolongerGarantie(12); echo "Période de garantie après prolongation: " . $r->getPeriodeGarantie() . " mois\n"; ?>
Sortie:
ID du produit: P123 Nom: Lave-vaisselle Prix après réduction: 425.0 € Remise appliquée au refrigérateur: Réfrigérateur Samsung ID du produit: P789 Nom: Réfrigérateur Samsung Prix après réduction: 765.0 € Période de garantie: 12 mois Période de garantie après prolongation: 24 mois
Exercice 3:
Écrire un programme PHP pour créer une classe appelée « Batiment » avec des attributs pour l’adresse, le nombre d’étages et la surface totale. Créez des sous-classes « BatimentResidentiel » et « BatimentCommercial » qui ajoutent des attributs spécifiques tels que le nombre d’appartements pour les bâtiments résidentiels et l’espace de bureau pour les bâtiments commerciaux. Implémentez une méthode pour calculer le loyer total pour chaque sous-classe.
Diagrame de classe:

<?php // Définir la classe Batiment class Batiment { // Attributs de la classe Batiment protected $adresse; protected $nombreDetages; protected $surfaceTotale; // Constructeur pour la classe Batiment public function __construct($adresse, $nombreDetages, $surfaceTotale) { $this->adresse = $adresse; $this->nombreDetages = $nombreDetages; $this->surfaceTotale = $surfaceTotale; } // Méthode pour afficher des informations sur le bâtiment public function afficher() { echo "Adresse: " . $this->adresse . "\n"; echo "Nombre d'étages: " . $this->nombreDetages . "\n"; echo "Surface totale: " . $this->surfaceTotale . " mètres\n"; } } // Définir la classe BatimentResidentiel qui hérite de Batiment class BatimentResidentiel extends Batiment { // Attribut supplémentaire pour BatimentResidentiel private $nombreDappartements; private $loyerParAppartement; // Constructeur de la classe BatimentResidentiel public function __construct($adresse, $nombreDetages, $surfaceTotale, $nombreDappartements, $loyerParAppartement) { // Appeler le constructeur de la classe mère parent::__construct($adresse, $nombreDetages, $surfaceTotale); $this->nombreDappartements = $nombreDappartements; $this->loyerParAppartement = $loyerParAppartement; } // Méthode pour calculer le loyer total d'un bâtiment résidentiel public function calculateTotalRent() { return $this->nombreDappartements * $this->loyerParAppartement; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires public function afficher() { parent::afficher(); echo "Nombre d'appartements: " . $this->nombreDappartements . "\n"; echo "Loyer par appartement: " . $this->loyerParAppartement . " €\n"; echo "Total des loyers: " . $this->calculateTotalRent() . " €\n"; } } // Définir la classe BatimentCommercial qui hérite de Batiment class BatimentCommercial extends Batiment { // Attribut supplémentaire pour BatimentCommercial private $espaceBureau; // en mètres carrés private $loyerParMetreCarre; // Constructeur de la classe BatimentCommercial public function __construct($adresse, $nombreDetages, $surfaceTotale, $espaceBureau, $loyerParMetreCarre) { // Appeler le constructeur de la classe mère parent::__construct($adresse, $nombreDetages, $surfaceTotale); $this->espaceBureau = $espaceBureau; $this->loyerParMetreCarre = $loyerParMetreCarre; } // Méthode pour calculer le loyer total d'un bâtiment commercial public function calculateTotalRent() { return $this->espaceBureau * $this->loyerParMetreCarre; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires public function afficher() { parent::afficher(); echo "Espace de bureau: " . $this->espaceBureau . " mètres\n"; echo "Loyer par mètre carré: " . $this->loyerParMetreCarre . " €\n"; echo "Total des loyers: " . $this->calculateTotalRent() . " €\n"; } } // Créer une instance de BatimentResidentiel $r = new BatimentResidentiel("Rue 30, Quartier Saindenis", 15, 23000.0, 30, 1500.0); // Créer une instance de BatimentCommercial $c = new BatimentCommercial("Rue 11, Quartier Laurence", 20, 5000.0, 4000.0, 25.0); // Afficher des informations sur le bâtiment résidentiel echo "Info sur le bâtiment résidentiel:\n"; $r->afficher(); // Afficher des informations sur le bâtiment commercial echo "\nInfo sur le bâtiment commercial:\n"; $c->afficher(); ?>
Sortie:
Info sur le bâtiment résidentiel: Adresse: Rue 30, Quartier Saindenis Nombre d'étages: 15 Surface totale: 23000.0 mètres Nombre d'appartements: 30 Loyer par appartement: 1500.0 € Total des loyers: 45000.0 € Info sur le bâtiment commercial: Adresse: Rue 11, Quartier Laurence Nombre d'étages: 20 Surface totale: 5000.0 mètres Espace de bureau: 4000.0 mètres Loyer par mètre carré: 25.0 € Total des loyers: 100000.0 €
Exercice 4:
Écrire un programme PHP pour créer une classe appelée « Evenement » avec des attributs pour le nom de l’événement, la date et le lieu. Créer des sous-classes « Seminaire » et « PerformancesMusicales » qui ajoutent des attributs spécifiques tels que le nombre de conférenciers pour les séminaires et la liste des artistes pour les concerts. Implémenter des méthodes pour afficher les détails de l’événement et vérifier s’il y a des conflits dans le planning de l’événement.
Diagrame de classe:

<?php // Définir la classe Evenement class Evenement { // Déclarer les attributs protected $nomEvenement; protected $date; protected $lieu; // Constructeur pour initialiser les attributs public function __construct($nomEvenement, $date, $lieu) { $this->nomEvenement = $nomEvenement; $this->date = $date; $this->lieu = $lieu; } // Afficher le nom, la date et le lieu de l'événement public function afficher() { echo "Nom de l'événement: " . $this->nomEvenement . "\n"; // Formater la date echo "Date: " . $this->date->format('Y-m-d H:i:s') . "\n"; echo "Lieu: " . $this->lieu . "\n"; } // Vérifie s'il y a un conflit entre événements public function checkConflit(Evenement $e) { return $this->date == $e->date && $this->lieu == $e->lieu; } } // Définir la classe Séminaire qui hérite de Evenement class Seminaire extends Evenement { // Attribut supplémentaire pour le nombre de conférenciers private $nombreDeConf; public function __construct($nomEvenement, $date, $lieu, $nombreDeConf) { parent::__construct($nomEvenement, $date, $lieu); $this->nombreDeConf = $nombreDeConf; } public function afficher() { parent::afficher(); echo "Nombre de conférenciers: " . $this->nombreDeConf . "\n"; } } // Définir la classe PerformancesMusicales qui hérite de Evenement class PerformancesMusicales extends Evenement { // Attribut supplémentaire pour la liste des artistes private $artistes; public function __construct($nomEvenement, $date, $lieu, $artistes) { parent::__construct($nomEvenement, $date, $lieu); $this->artistes = $artistes; } public function afficher() { parent::afficher(); // Utiliser implode pour joindre les artistes echo "Artistes: " . implode(", ", $this->artistes) . "\n"; } } // Créer des dates différentes pour éviter les conflits // Créer une date pour les tests $date = new DateTime(); // Créer une instance de Seminaire $seminar = new Seminaire("La journée d'étude", $date, "Centre de congrès", 4); // Créer une instance de PerformancesMusicales $artistes = ["Groupe A", "Groupe B"]; $performance = new PerformancesMusicales("Teintes harmonieuses", $date, "Centre de congrès", $artistes); // Afficher les détails du séminaire echo "Les détails du séminaire:\n"; $seminar->afficher(); // Afficher les détails de la performance musicale echo "\nLes détails de la performance musicale:\n"; $performance->afficher(); // Vérifier s'il y a des conflits d'horaire if ($seminar->checkConflit($performance)) { echo "\nConflit détecté : Les deux événements sont programmés à la même heure et au même endroit.\n"; } else { echo "\nPas de conflit : Les événements sont programmés à des moments ou dans des lieux différents.\n"; } ?>
Sortie:
Les détails du séminaire: Nom de l'événement: La journée d'étude Date: Sun Sep 29 18:17:37 GMT 2024 Lieu: Centre de congrès Nombre de conférenciers: 4 Les détails de la performance musicale: Nom de l'événement: Teintes harmonieuses Date: Sun Sep 29 18:17:37 GMT 2024 Lieu: Centre de congrès Artistes: Groupe A, Groupe B Conflit détecté : Les deux événements sont programmés à la même heure et au même endroit.
Exercice 5:
Écrivez un programme PHP pour créer une classe appelée « CommandeClient » avec des attributs pour l’ID de la commande, le client et la date de la commande. Créez une sous-classe « CommandeEnLigne » qui ajoute des attributs pour l’adresse de livraison et le numéro de suivi. Implémentez des méthodes pour calculer le délai de livraison en fonction de l’adresse et mettre à jour le statut de la livraison.
Diagrame de classe:

<?php // Définir le fuseau horaire date_default_timezone_set('UTC'); // Définir la classe CommandeClient class CommandeClient { // Attributs pour l'ID de la commande, le client et la date de la // commande private $idCommande; private $client; private $dateCommande; // Constructeur pour initialiser l'objet CommandeClient public function __construct($idCommande, $client, $dateCommande) { $this->idCommande = $idCommande; $this->client = $client; // Conversion en DateTime $this->dateCommande = new DateTime($dateCommande); } // Méthode pour récupérer l'ID de la commande public function getIdCommande() { return $this->idCommande; } // Méthode pour récupérer le client public function getClient() { return $this->client; } // Méthode pour récupérer la date de la commande public function getDateCommande() { return $this->dateCommande; } // Méthode pour afficher les détails de la commande public function afficher() { echo "ID de la commande: " . $this->idCommande . "\n"; echo "Client: " . $this->client . "\n"; echo "Date de la commande: " . $this->dateCommande->format('Y-m-d H:i:s') . "\n"; // Formater la date } } // Définir la sous-classe CommandeEnLigne qui hérite de CommandeClient class CommandeEnLigne extends CommandeClient { // Attributs spécifiques pour l'adresse de livraison et le numéro // de suivi private $adresseLivraison; private $numSuivi; // Constructeur pour initialiser l'objet CommandeEnLigne public function __construct($idCommande, $client, $dateCommande, $adresseLivraison, $numSuivi) { // Appeler le constructeur de la classe mère pour initialiser // les attributs communs parent::__construct($idCommande, $client, $dateCommande); $this->adresseLivraison = $adresseLivraison; $this->numSuivi = $numSuivi; } // Méthode pour récupérer l'adresse de livraison public function getAdresseLivraison() { return $this->adresseLivraison; } // Méthode pour récupérer le numéro de suivi public function getNumSuivi() { return $this->numSuivi; } // Méthode pour calculer le délai de livraison en fonction de // l'adresse public function calculerDelaiLivraison() { // En supposant que le délai de livraison est basé sur la // longueur de la chaîne d'adresse return strlen($this->adresseLivraison) % 10 + 1; } // Méthode de mise à jour de l'état de suivi public function actualiserEtatSuivi($newEtat) { // Afficher l'état de suivi mis à jour echo "Numéro de suivi: " . $this->numSuivi . " - État: " . $newEtat . "\n"; } // Surcharger la méthode afficher pour inclure des détails // supplémentaires public function afficher() { // Appeler la méthode de la classe mère pour afficher les // détails communs parent::afficher(); // Afficher des détails supplémentaires pour la commande en // ligne echo "Adresse de livraison: ".$this->adresseLivraison."\n"; echo "Numéro de suivi: " . $this->numSuivi . "\n"; } } // date(): renvoie la date actuelle // Créer un objet CommandeClient $c1 = new CommandeClient("C123", "Alex Leo", date('Y-m-d')); // Afficher les détails de la commande $c1->afficher(); echo "\n"; // Créer un objet CommandeEnLigne $c2 = new CommandeEnLigne("C789", "Ali Boura", date('Y-m-d'), "Rue 30, Quartier Saindenis", "Ref129"); // Afficher les détails de la commande en ligne $c2->afficher(); // Calculer et afficher le délai de livraison $t = $c2->calculerDelaiLivraison(); echo "Délai de livraison estimé: " . $t . " jours\n"; // Mettre à jour et afficher l'état de la commande $c2->actualiserEtatSuivi("En cours de route"); ?>
Sortie:
ID de la commande: C123 Client: Alex Leo Date de la commande: 2024-09-29 ID de la commande: c789 Client: Ali Boura Date de la commande: 2024-09-29 Adresse de livraison: Rue 30, Quartier Saindenis Numéro de suivi: Ref129 Délai de livraison estimé: 7 jours Numéro de suivi: Ref129 - Etat: En cours de route
Éditeur de code PHP: Testez votre code en ligne!
Exercices corrigés PHP – Programmation Orientée Objet | Partie 2
Exercices corrigés PHP – Programmation Orientée Objet | Partie 3
Exercices corrigés PHP – Programmation Orientée Objet | Partie 4
Exercices corrigés PHP – Programmation Orientée Objet | Partie 5
Exercices corrigés PHP – Programmation Orientée Objet | Partie 6

- Exercice PHP Corrigé – Partie 1
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 1
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 2
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 3
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 4
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 5
- Exercices corrigés PHP – Programmation Orientée Objet | Partie 6