Funcionalidad de búsqueda
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 85 de 91.
Desafío
FácilVamos a mejorar nuestro Sistema de Gestión de Bibliotecas añadiendo funcionalidad de búsqueda. Los usuarios necesitan encontrar libros fácilmente, ya sea buscando un título específico, navegando por autor o comprobando qué está disponible actualmente para préstamo.
Organizarás tu código en cuatro 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. Amplía tu claseLibrarycon la funcionalidad existente más tres nuevos métodos de búsqueda:searchByTitle(string $keyword): array— devuelve todos los libros donde el título contiene la palabra clave (insensible a mayúsculas y minúsculas)searchByAuthor(string $author): array— devuelve todos los libros donde el nombre del autor contiene el término de búsqueda (insensible a mayúsculas y minúsculas)getAvailableBooks(): array— devuelve solo los libros que están actualmente disponibles para préstamo
Usa
array_filtercon funciones de flecha ystripospara la coincidencia insensible a mayúsculas y minúsculas. Recuerda questriposdevuelvefalsecuando no se encuentra ninguna coincidencia, así que verifica con!== false.main.php— Incluye el archivo Library. Recibirás dos entradas: una palabra clave de búsqueda y un nombre de autor.Crea una
Libraryy añade estos cuatro libros:- ISBN:
"978-0", Title:"PHP Basics", Author:"John Smith" - ISBN:
"978-1", Title:"Advanced PHP", Author:"Jane Doe" - ISBN:
"978-2", Title:"Python Guide", Author:"John Smith" - ISBN:
"978-3", Title:"Web Development", Author:"Alice Brown"
Toma prestado el libro con ISBN
"978-1"usando unUsercon ID1y nombre"TestUser".Luego realiza estas búsquedas e imprime los resultados:
- Busca por título usando la primera entrada, imprime el título de cada libro coincidente en una nueva línea
- Busca por autor usando la segunda entrada, imprime el recuento de libros coincidentes
- Obtén los libros disponibles e imprime el recuento
Formato de salida:
Title matches: [title1] [title2] ... Author matches: [count] Available: [count]- ISBN:
Este desafío demuestra cómo array_filter combinado con stripos crea una funcionalidad de búsqueda potente y fácil de usar. La coincidencia insensible a mayúsculas y minúsculas significa que los usuarios no necesitan preocuparse por el uso exacto de mayúsculas al buscar.
Pruébalo tú mismo
<?php
require_once 'Library.php';
// Leer entradas
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));
// TODO: Crear una instancia de Library
// TODO: Añadir los cuatro libros a la biblioteca:
// ISBN: "978-0", Title: "PHP Basics", Author: "John Smith"
// ISBN: "978-1", Title: "Advanced PHP", Author: "Jane Doe"
// ISBN: "978-2", Title: "Python Guide", Author: "John Smith"
// ISBN: "978-3", Title: "Web Development", Author: "Alice Brown"
// TODO: Crear un Usuario con ID 1 y nombre "TestUser", registrarlo
// TODO: Tomar prestado el libro con ISBN "978-1"
// TODO: Buscar por título usando $searchKeyword e imprimir resultados
echo "Title matches:\n";
// Imprimir el título de cada libro coincidente en una nueva línea
// TODO: Buscar por autor usando $authorName e imprimir el recuento
echo "Author matches: " . /* recuento aquí */ "\n";
// TODO: Obtener libros disponibles e imprimir el recuento
echo "Available: " . /* recuento aquí */ "\n";
?>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