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 orqueste todas las operaciones de préstamo. Este coordinador central gestionará la colección de libros y hará cumplir las reglas que mantienen nuestra biblioteca funcionando sin problemas.
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 comotrue, y los métodos:isAvailable(),markAsBorrowed()ymarkAsReturned().User.php— Incluye el archivo Book. Tu claseUsercon propiedades de solo lectura (id,name), un array privado$borrowedBooks, una constanteMAX_BOOKSde3, y 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 array privado
$bookspara almacenar libros indexados por ISBN addBook(Book $book): void— añade 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 apropiadosreturnBook(User $user, string $isbn): string— procesa las devoluciones y actualiza el estado tanto del libro como del usuario
El método
borrowBookdebe verificar tres condiciones en orden y devolver estos mensajes exactos:"Book not found"— si el libro no existe"Book is not available"— si ya está prestado"Borrowing limit reached"— si el usuario tiene 3 libros"Successfully borrowed: [title]"— en caso de éxito
El método
returnBookdebe devolver"Book not found"si el libro no existe, o"Successfully returned: [title]"en caso de éxito.- Un array privado
main.php— Incluye el archivo Library. Recibirás dos entradas: un ISBN y un título de libro.Crea una
Library, unUsercon ID1y nombre"Alice", y unBookcon el ISBN proporcionado, el título y el autor"Unknown". Añade el libro a la biblioteca, luego realiza estas operaciones e imprime cada resultado en una nueva línea:- Prestar el libro
- Intentar prestar el mismo libro de nuevo
- Devolver el libro
- Prestar el libro una vez más
Este desafío demuestra cómo la clase Library centraliza la lógica de negocio: valida condiciones, coordina los cambios de estado en los objetos Book y User, y devuelve una respuesta significativa para cada operación.
Pruébalo tú mismo
<?php
require_once 'Library.php';
// Leer entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Crear una instancia de Library
// TODO: Crear un User con ID 1 y nombre "Alice"
// TODO: Crear un Book con el ISBN proporcionado, el título y el autor "Unknown"
// TODO: Agregar el libro a la biblioteca
// TODO: Realizar estas operaciones e imprimir cada resultado en una nueva línea:
// 1. Tomar prestado el libro
// 2. Intentar tomar prestado el mismo libro de nuevo
// 3. Devolver el libro
// 4. Tomar prestado el libro una vez más
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - Colección personalizada11Sistema de tipos y manejo de errores
Declaraciones de tiposTipos anulablesTipos de unión e intersecciónClases de excepciónJerarquía de excepciones personalizadasTry, Catch, FinallyResumen - Validador de formularios14Proyecto: Gestión de biblioteca
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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy