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. Este coordenador central gerenciará a coleção de livros e aplicará as regras que mantêm nossa biblioteca funcionando perfeitamente.
Você organizará seu código em quatro arquivos:
Book.php— Sua classeBookda lição anterior com propriedades readonly (isbn,title,author), uma propriedade privada$isAvailablecomeçando 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. Crie uma classeLibraryque gerencia 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 as mensagens apropriadasreturnBook(User $user, string $isbn): string— processa devoluções e atualiza o estado tanto do livro quanto 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 um título de livro.Crie uma
Library, umUsercom ID1e nome"Alice", e umBookcom o ISBN fornecido, título e autor"Unknown". Adicione o livro à biblioteca, depois realize estas operações e imprima cada resultado em uma nova linha:- Emprestar o livro
- Tentar emprestar o mesmo livro novamente
- Devolver o livro
- Emprestar o livro mais uma vez
Este desafio demonstra como a classe Library centraliza a lógica de negócio — ela valida condições, coordena mudanças 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: Criar uma instância de Library
// TODO: Criar um User com ID 1 e nome "Alice"
// TODO: Criar um Book com o ISBN fornecido, título e autor "Unknown"
// TODO: Adicionar o livro à biblioteca
// TODO: Realizar estas operações e imprimir cada resultado em uma nova linha:
// 1. Emprestar o livro
// 2. Tentar emprestar o mesmo livro novamente
// 3. Devolver o livro
// 4. Emprestar o livro mais uma vez
?>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