Système d'emprunt
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 84 sur 91.
Défi
FacileDonnons vie à notre système de gestion de bibliothèque en créant la classe Library qui orchestre toutes les opérations d'emprunt. Ce coordinateur central gérera la collection de livres et appliquera les règles qui permettent à notre bibliothèque de fonctionner correctement.
Vous organiserez votre code sur quatre fichiers :
Book.php— Votre classeBookde la leçon précédente avec des propriétés en lecture seule (isbn,title,author), une propriété privée$isAvailableinitialisée àtrue, et les méthodes :isAvailable(),markAsBorrowed(), etmarkAsReturned().User.php— Incluez le fichier Book. Votre classeUseravec des propriétés en lecture seule (id,name), un tableau privé$borrowedBooks, une constanteMAX_BOOKSde3, et les méthodes :getBorrowedBooks(),canBorrow(),addBook(Book $book), etremoveBook(string $isbn).Library.php— Incluez le fichier User. Créez une classeLibraryqui gère la collection de livres. Votre bibliothèque doit avoir :- Un tableau privé
$bookspour stocker les livres indexés par ISBN addBook(Book $book): void— ajoute un livre à la collectionfindBook(string $isbn): ?Book— retourne le livre ou null s'il n'est pas trouvéborrowBook(User $user, string $isbn): string— valide et traite l'emprunt, en retournant les messages appropriésreturnBook(User $user, string $isbn): string— traite les retours et met à jour l'état du livre et de l'utilisateur
La méthode
borrowBookdoit vérifier trois conditions dans l'ordre et retourner ces messages exacts :"Book not found"— si le livre n'existe pas"Book is not available"— s'il est déjà emprunté"Borrowing limit reached"— si l'utilisateur a déjà 3 livres"Successfully borrowed: [title]"— en cas de succès
La méthode
returnBookdoit retourner"Book not found"si le livre n'existe pas, ou"Successfully returned: [title]"en cas de succès.- Un tableau privé
main.php— Incluez le fichier Library. Vous recevrez deux entrées : un ISBN et un titre de livre.Créez une
Library, unUseravec l'ID1et le nom"Alice", et unBookavec l'ISBN fourni, le titre fourni, et l'auteur"Unknown". Ajoutez le livre à la bibliothèque, puis effectuez ces opérations et affichez chaque résultat sur une nouvelle ligne :- Emprunter le livre
- Essayer d'emprunter à nouveau le même livre
- Retourner le livre
- Emprunter le livre une fois de plus
Ce défi démontre comment la classe Library centralise la logique métier — elle valide les conditions, coordonne les changements d'état entre les objets Book et User, et fournit un retour d'information significatif pour chaque opération.
Essayez vous-même
<?php
require_once 'Library.php';
// Lire l'entrée
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Créer une instance de Library
// TODO: Créer un User avec l'ID 1 et le nom "Alice"
// TODO: Créer un Book avec l'ISBN fourni, le titre, et l'auteur "Unknown"
// TODO: Ajouter le livre à la bibliothèque
// TODO: Effectuer ces opérations et afficher chaque résultat sur une nouvelle ligne :
// 1. Emprunter le livre
// 2. Essayer d'emprunter à nouveau le même livre
// 3. Retourner le livre
// 4. Emprunter le livre une fois de plus
?>Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée11Système de types et gestion des erreurs
Déclarations de typesTypes nullablesTypes d'union et d'intersectionClasses d'exceptionHiérarchie d'exceptions personnaliséesTry, Catch, FinallyRécapitulatif - Validateur de formulaire14Projet : Gestion de bibliothèque
Présentation du projetClasses Livre et Utilisateur3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie