Sistema de Empréstimos
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 84 de 91.
Desafio
FácilVamos dar vida ao nosso Sistema de Gerenciamento de Biblioteca criando a classe Library, que orquestra todas as operações de empréstimo. Esse coordenador central gerenciará a coleção de livros e aplicará as regras que mantêm nossa biblioteca funcionando sem problemas.
Você organizará seu código em quatro arquivos:
Book.php: sua classeBookda lição anterior, com propriedades readonly (isbn,title,author), uma propriedade privada$isAvailableiniciada comotruee os métodos:isAvailable(),markAsBorrowed()emarkAsReturned().User.php: inclua o arquivo Book. Sua classeUsercom propriedades readonly (id,name), um array privado$borrowedBooks, uma constanteMAX_BOOKScom valor3e os métodos:getBorrowedBooks(),canBorrow(),addBook(Book $book)eremoveBook(string $isbn).Library.php: inclua o arquivo User. Crie uma classeLibraryque gerencie a coleção de livros. Sua biblioteca deve ter:- Um array privado
$bookspara armazenar livros indexados pelo ISBN addBook(Book $book): void: adiciona um livro à coleçãofindBook(string $isbn): ?Book: retorna o livro ou null se não for encontradoborrowBook(User $user, string $isbn): string: valida e processa o empréstimo, retornando mensagens apropriadasreturnBook(User $user, string $isbn): string: processa devoluções e atualiza o estado do livro e do usuário
O método
borrowBookdeve verificar três condições em ordem e retornar estas mensagens exatas:"Book not found": se o livro não existir"Book is not available": se já estiver emprestado"Borrowing limit reached": se o usuário tiver 3 livros"Successfully borrowed: [title]": em caso de sucesso
O método
returnBookdeve retornar"Book not found"se o livro não existir ou"Successfully returned: [title]"em caso de sucesso.- Um array privado
main.php: inclua o arquivo Library. Você receberá duas entradas: um ISBN e o título de um livro.Crie uma
Library, umUsercom ID1e nome"Alice"e umBookcom o ISBN e o título fornecidos e o autor"Unknown". Adicione o livro à biblioteca e, em seguida, execute estas operações, imprimindo cada resultado em uma nova linha:- Empreste o livro
- Tente emprestar o mesmo livro novamente
- Devolva o livro
- Empreste o livro mais uma vez
Este desafio demonstra como a classe Library centraliza a lógica de negócios. Ela valida condições, coordena alterações de estado entre os objetos Book e User e retorna um feedback significativo para cada operação.
Experimente você mesmo
<?php
require_once 'Library.php';
// Ler entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Crie uma instância de Library
// TODO: Crie um User com ID 1 e nome "Alice"
// TODO: Crie um Book com o ISBN fornecido, título e autor "Unknown"
// TODO: Adicione o livro à biblioteca
// TODO: Execute estas operações e imprima cada resultado em uma nova linha:
// 1. Empreste o livro
// 2. Tente emprestar o mesmo livro novamente
// 3. Devolva o livro
// 4. Empreste o livro mais uma vez
?>Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da 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 às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem 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 NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre 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 StrategyPratique por conta própria: Compilador de PHP online