Interface de Administrador
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 86 de 91.
Desafio
FácilVamos estender nosso Sistema de Gerenciamento de Biblioteca adicionando recursos administrativos. Você criará uma classe Admin que herda de User, mas tem poderes especiais para gerenciar o acervo da biblioteca: adicionar novos livros e remover os existentes.
Você organizará seu código em cinco arquivos:
Book.php: sua classeBookcom propriedades somente leitura (isbn,title,author), uma propriedade privada$isAvailableiniciada comotruee os métodos:isAvailable(),markAsBorrowed()emarkAsReturned().User.php: inclua o arquivo Book. Sua classeUsercom propriedades somente leitura (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. Sua classeLibrarycom a funcionalidade existente, incluindoaddBook(),findBook(),borrowBook(),returnBook()e os métodos de busca. Adicione um novo método:removeBook(string $isbn): void: remove um livro da coleção usandounset()
Admin.php: inclua o arquivo Library. Crie uma classeAdminque estendeUser. Os administradores herdam todos os recursos dos usuários, mas ganham dois métodos administrativos:addBookToLibrary(Library $library, Book $book): string: adiciona o livro à biblioteca e retorna"Added: [title]"removeBookFromLibrary(Library $library, string $isbn): string: tenta remover um livro seguindo estas verificações:- Se o livro não existir, retorne
"Book not found" - Se o livro estiver emprestado no momento, retorne
"Cannot remove: book is currently borrowed" - Caso contrário, remova-o e retorne
"Removed: [title]"
- Se o livro não existir, retorne
main.php: inclua o arquivo Admin. Você receberá duas entradas: um ISBN e o título de um livro.Crie uma
Librarye umAdmincom ID1e nome"AdminUser". Crie também umUsercomum com ID2e nome"RegularUser".Crie um
Bookcom o ISBN e o título fornecidos e com o autor"Test Author". Execute estas operações e imprima cada resultado em uma nova linha:- Faça o administrador adicionar o livro à biblioteca
- Faça o usuário comum pegar o livro emprestado
- Faça o administrador tentar remover o livro (deve falhar: ele está emprestado)
- Faça o usuário comum devolver o livro
- Faça o administrador remover o livro (agora deve funcionar)
- Faça o administrador tentar remover o mesmo livro novamente (deve falhar, pois o livro não foi encontrado)
Este desafio demonstra como a herança cria uma hierarquia natural: administradores são usuários com privilégios adicionais. As verificações de segurança em removeBookFromLibrary garantem a integridade dos dados ao impedir a remoção de livros que ainda estão em circulação.
Experimente você mesmo
<?php
require_once 'Admin.php';
// Ler entrada
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));
// TODO: Criar uma Library
// TODO: Criar um Admin com ID 1 e nome "AdminUser"
// TODO: Criar um User regular com ID 2 e nome "RegularUser"
// TODO: Criar um Book com o ISBN fornecido, título e autor "Test Author"
// TODO: Realize estas operações e imprima cada resultado em uma nova linha:
// 1. Faça o admin adicionar o book à library
// 2. Faça o usuário regular emprestar o book
// 3. Faça o admin tentar remover o book (deve falhar - está emprestado)
// 4. Faça o usuário regular devolver o book
// 5. Faça o admin remover o book (deve ter sucesso agora)
// 6. Faça o admin tentar remover o mesmo book novamente (deve falhar - não encontrado)
?>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