Sistema de préstamos
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 84 de 91.
Desafío
FácilDemos vida a nuestro sistema de gestión de biblioteca creando la clase Library, que coordina todas las operaciones de préstamo. Este coordinador central gestionará la colección de libros y hará cumplir las reglas que mantienen el funcionamiento fluido de nuestra biblioteca.
Organizarás tu código en cuatro archivos:
Book.php: Tu claseBookde la lección anterior, con propiedades de solo lectura (isbn,title,author), una propiedad privada$isAvailableque comienza comotruey los métodos:isAvailable(),markAsBorrowed()ymarkAsReturned().User.php: Incluye el archivo Book. Tu claseUser, con propiedades de solo lectura (id,name), un arreglo privado$borrowedBooks, una constanteMAX_BOOKScon valor3y los métodos:getBorrowedBooks(),canBorrow(),addBook(Book $book)yremoveBook(string $isbn).Library.php: Incluye el archivo User. Crea una claseLibraryque gestione la colección de libros. Tu biblioteca debe tener:- Un arreglo privado
$bookspara almacenar libros indexados por ISBN addBook(Book $book): void: agrega un libro a la colecciónfindBook(string $isbn): ?Book: devuelve el libro o null si no se encuentraborrowBook(User $user, string $isbn): string: valida y procesa el préstamo, devolviendo los mensajes correspondientesreturnBook(User $user, string $isbn): string: procesa las devoluciones y actualiza el estado tanto del libro como del usuario
El método
borrowBookdebe comprobar tres condiciones en orden y devolver estos mensajes exactos:"Book not found": si el libro no existe"Book is not available": si ya se ha prestado"Borrowing limit reached": si el usuario tiene 3 libros"Successfully borrowed: [title]": si la operación se realiza correctamente
El método
returnBookdebe devolver"Book not found"si el libro no existe, o"Successfully returned: [title]"si la operación se realiza correctamente.- Un arreglo privado
main.php: Incluye el archivo Library. Recibirás dos entradas: un ISBN y el título de un libro.Crea una
Library, unUsercon el ID1y el nombre"Alice", y unBookcon el ISBN y el título proporcionados, y con el autor"Unknown". Agrega el libro a la biblioteca, después realiza estas operaciones e imprime cada resultado en una línea nueva:- Pedir prestado el libro
- Intentar pedir prestado el mismo libro otra vez
- Devolver el libro
- Pedir prestado el libro una vez más
Este desafío demuestra cómo la clase Library centraliza la lógica de negocio. Valida las condiciones, coordina los cambios de estado entre los objetos Book y User, y devuelve información significativa para cada operación.
Pruébalo tú mismo
<?php
require_once 'Library.php';
// Lee la entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Crea una instancia de Library
// TODO: Crea un User con ID 1 y nombre "Alice"
// TODO: Crea un Book con el ISBN proporcionado, el título y el autor "Unknown"
// TODO: Añade el libro a la biblioteca
// TODO: Realiza estas operaciones e imprime cada resultado en una nueva línea:
// 1. Presta el libro
// 2. Intenta prestar el mismo libro de nuevo
// 3. Devuelve el libro
// 4. Presta el libro una vez más
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada11Sistema de tipos y manejo de errores
Declaraciones de tiposTipos anulablesTipos unión e intersecciónClases de excepcionesJerarquía de excepciones personalizadaTry, Catch, FinallyRepaso: validador de formularios14Proyecto: Gestión de Bibliotecas
Descripción general del proyectoClases de libros y usuarios3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online