Funcionalidade de Busca
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 85 de 91.
Desafio
FácilVamos aprimorar nosso Sistema de Gerenciamento de Biblioteca adicionando funcionalidade de busca. Os usuários precisam encontrar livros facilmente, seja procurando por um título específico, navegando por autor ou verificando o que está disponível no momento para empréstimo.
Você organizará seu código em quatro arquivos:
Book.php— Sua classeBookcom propriedades readonly (isbn,title,author), uma propriedade privada$isAvailableiniciando comotrue, e os métodos:isAvailable(),markAsBorrowed()emarkAsReturned().User.php— Inclua o arquivo Book. Sua classeUsercom propriedades readonly (id,name), um array privado$borrowedBooks, uma constanteMAX_BOOKSde3, e os métodos:getBorrowedBooks(),canBorrow(),addBook(Book $book)eremoveBook(string $isbn).Library.php— Inclua o arquivo User. Expanda sua classeLibrarycom a funcionalidade existente mais três novos métodos de busca:searchByTitle(string $keyword): array— retorna todos os livros onde o título contém a palavra-chave (insensível a maiúsculas e minúsculas)searchByAuthor(string $author): array— retorna todos os livros onde o nome do autor contém o termo de busca (insensível a maiúsculas e minúsculas)getAvailableBooks(): array— retorna apenas os livros que estão disponíveis no momento para empréstimo
Use
array_filtercom arrow functions estripospara correspondência insensível a maiúsculas e minúsculas. Lembre-se questriposretornafalsequando nenhuma correspondência é encontrada, então verifique por!== false.main.php— Inclua o arquivo Library. Você receberá duas entradas: uma palavra-chave de busca e um nome de autor.Crie uma
Librarye adicione estes quatro livros:- 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"
Empreste o livro com ISBN
"978-1"usando umUsercom ID1e nome"TestUser".Em seguida, realize estas buscas e imprima os resultados:
- Busque por título usando a primeira entrada, imprima o título de cada livro correspondente em uma nova linha
- Busque por autor usando a segunda entrada, imprima a contagem de livros correspondentes
- Obtenha os livros disponíveis e imprima a contagem
Formato de saída:
Title matches: [title1] [title2] ... Author matches: [count] Available: [count]- ISBN:
Este desafio demonstra como o array_filter combinado com o stripos cria uma funcionalidade de busca poderosa e amigável ao usuário. A correspondência insensível a maiúsculas e minúsculas significa que os usuários não precisam se preocupar com a capitalização exata ao pesquisar.
Experimente você mesmo
<?php
require_once 'Library.php';
// Ler entradas
$searchKeyword = trim(fgets(STDIN));
$authorName = trim(fgets(STDIN));
// TODO: Criar uma instância de Library
// TODO: Adicionar os quatro livros à 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: Criar um User com ID 1 e nome "TestUser", registrá-lo
// TODO: Emprestar o livro com ISBN "978-1"
// TODO: Pesquisar por título usando $searchKeyword e imprimir os resultados
echo "Title matches:\n";
// Imprimir o título de cada livro correspondente em uma nova linha
// TODO: Pesquisar por autor usando $authorName e imprimir a contagem
echo "Author matches: " . /* contagem aqui */ "\n";
// TODO: Obter livros disponíveis e imprimir a contagem
echo "Available: " . /* contagem aqui */ "\n";
?>Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy