Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Demos 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 clase Book de la lección anterior con propiedades de solo lectura (isbn, title, author), una propiedad privada $isAvailable que comienza como true, y los métodos: isAvailable(), markAsBorrowed() y markAsReturned().
  • User.php — Incluye el archivo Book. Tu clase User con propiedades de solo lectura (id, name), un array privado $borrowedBooks, una constante MAX_BOOKS de 3, y los métodos: getBorrowedBooks(), canBorrow(), addBook(Book $book) y removeBook(string $isbn).
  • Library.php — Incluye el archivo User. Crea una clase Library que gestione la colección de libros. Tu biblioteca debe tener:
    • Un array privado $books para almacenar libros indexados por ISBN
    • addBook(Book $book): void — añade un libro a la colección
    • findBook(string $isbn): ?Book — devuelve el libro o null si no se encuentra
    • borrowBook(User $user, string $isbn): string — valida y procesa el préstamo, devolviendo los mensajes apropiados
    • returnBook(User $user, string $isbn): string — procesa las devoluciones y actualiza el estado tanto del libro como del usuario

    El método borrowBook debe 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 returnBook debe devolver "Book not found" si el libro no existe, o "Successfully returned: [title]" en caso de éxito.

  • main.php — Incluye el archivo Library. Recibirás dos entradas: un ISBN y un título de libro.

    Crea una Library, un User con ID 1 y nombre "Alice", y un Book con 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:

    1. Prestar el libro
    2. Intentar prestar el mismo libro de nuevo
    3. Devolver el libro
    4. 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