Clases de Libros y Usuarios
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 83 de 91.
Desafío
FácilConstruyamos la base de nuestro Sistema de Gestión de Biblioteca creando las clases Book y User. Estos objetos de dominio centrales trabajarán juntos para gestionar las operaciones de la biblioteca.
Organizarás tu código en tres archivos:
Book.php— Crea una claseBookque rastree los libros de la biblioteca. Tu libro debe tener tres propiedades de solo lectura (readonly) establecidas mediante la promoción del constructor:isbn,titleyauthor. Incluye una propiedad privada$isAvailableque comience comotrue. Añade tres métodos:isAvailable(): bool— devuelve el estado de disponibilidadmarkAsBorrowed(): void— establece la disponibilidad en falsemarkAsReturned(): void— establece la disponibilidad en true
User.php— Incluye el archivo Book y crea una claseUserque represente a los miembros de la biblioteca. Tu usuario debe tener dos propiedades de solo lectura mediante la promoción del constructor:id(int) yname(string). Incluye un array privado$borrowedBooks(inicialmente vacío) y una constanteMAX_BOOKSestablecida en3. Añade estos métodos:getBorrowedBooks(): array— devuelve el array de libros prestadoscanBorrow(): bool— devuelve true si el usuario tiene menos de MAX_BOOKS prestadosaddBook(Book $book): void— añade un libro al array de prestadosremoveBook(string $isbn): void— elimina un libro por ISBN usandoarray_filter
main.php— Incluye el archivo User y da vida a tus clases. Recibirás cuatro entradas: un ID de usuario, un nombre de usuario, un ISBN de libro y un título de libro (el autor será"Unknown").Crea un
Usery unBookcon los valores proporcionados. Imprime si el usuario puede pedir prestado inicialmente, luego haz que el usuario pida prestado el libro (márcalo como prestado y añádelo al usuario). Finalmente, imprime la disponibilidad del libro y el recuento de libros prestados.Formato de salida:
Can borrow: [yes/no] Book available: [yes/no] Books borrowed: [count]
Observa cómo el encapsulamiento protege el estado interno: la disponibilidad de un libro solo cambia a través de métodos dedicados, y los libros prestados de un usuario se gestionan mediante un acceso controlado. Esta base servirá de apoyo al sistema de préstamos que construiremos a continuación.
Pruébalo tú mismo
<?php
require_once 'User.php';
// Leer entradas
$userId = intval(trim(fgets(STDIN)));
$userName = trim(fgets(STDIN));
$bookIsbn = trim(fgets(STDIN));
$bookTitle = trim(fgets(STDIN));
$bookAuthor = "Unknown";
// TODO: Crear un objeto User con el id y el nombre proporcionados
// TODO: Crear un objeto Book con el isbn, título y autor proporcionados
// TODO: Imprimir si el usuario puede pedir prestado inicialmente
// Formato: "Can borrow: yes" o "Can borrow: no"
// TODO: Hacer que el usuario pida prestado el libro:
// - Marcar el libro como prestado
// - Añadir el libro a los libros prestados del usuario
// TODO: Imprimir la disponibilidad del libro
// Formato: "Book available: yes" o "Book available: no"
// TODO: Imprimir el recuento de libros prestados
// Formato: "Books borrowed: [count]"
?>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