Interfaz de administrador
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 86 de 91.
Desafío
FácilAmpliemos nuestro Sistema de Gestión de Bibliotecas añadiendo capacidades administrativas. Crearás una clase Admin que hereda de User pero que tiene poderes especiales para gestionar el inventario de la biblioteca: añadir libros nuevos y eliminar los existentes.
Organizarás tu código en cinco archivos:
Book.php— Tu claseBookcon 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. Tu claseLibrarycon la funcionalidad existente que incluyeaddBook(),findBook(),borrowBook(),returnBook()y los métodos de búsqueda. Añade un nuevo método:removeBook(string $isbn): void— elimina un libro de la colección usandounset()
Admin.php— Incluye el archivo Library. Crea una claseAdminque extienda deUser. Los administradores heredan todas las capacidades de los usuarios pero obtienen dos métodos administrativos:addBookToLibrary(Library $library, Book $book): string— añade el libro a la biblioteca y devuelve"Added: [title]"removeBookFromLibrary(Library $library, string $isbn): string— intenta eliminar un libro con estas comprobaciones:- Si el libro no existe, devuelve
"Book not found" - Si el libro está prestado actualmente, devuelve
"Cannot remove: book is currently borrowed" - De lo contrario, elimínalo y devuelve
"Removed: [title]"
- Si el libro no existe, devuelve
main.php— Incluye el archivo Admin. Recibirás dos entradas: un ISBN y un título de libro.Crea una
Libraryy unAdmincon ID1y nombre"AdminUser". También crea unUserregular con ID2y nombre"RegularUser".Crea un
Bookcon el ISBN, título y autor"Test Author"proporcionados. Realiza estas operaciones e imprime cada resultado en una nueva línea:- Haz que el administrador añada el libro a la biblioteca
- Haz que el usuario regular pida prestado el libro
- Haz que el administrador intente eliminar el libro (debería fallar, está prestado)
- Haz que el usuario regular devuelva el libro
- Haz que el administrador elimine el libro (debería tener éxito ahora)
- Haz que el administrador intente eliminar el mismo libro de nuevo (debería fallar, no se encuentra)
Este desafío demuestra cómo la herencia crea una jerarquía natural: los administradores son usuarios con privilegios adicionales. Las comprobaciones de seguridad en removeBookFromLibrary garantizan la integridad de los datos al evitar la eliminación de libros que aún están en circulación.
Pruébalo tú mismo
<?php
require_once 'Admin.php';
// Leer entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Crear una Biblioteca (Library)
// TODO: Crear un Administrador (Admin) con ID 1 y nombre "AdminUser"
// TODO: Crear un Usuario (User) regular con ID 2 y nombre "RegularUser"
// TODO: Crear un Libro (Book) con el ISBN proporcionado, título y autor "Test Author"
// TODO: Realizar estas operaciones e imprimir cada resultado en una nueva línea:
// 1. Hacer que el administrador agregue el libro a la biblioteca
// 2. Hacer que el usuario regular pida prestado el libro
// 3. Hacer que el administrador intente eliminar el libro (debe fallar - está prestado)
// 4. Hacer que el usuario regular devuelva el libro
// 5. Hacer que el administrador elimine el libro (debe tener éxito ahora)
// 6. Hacer que el administrador intente eliminar el mismo libro de nuevo (debe fallar - no encontrado)
?>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