Interface Administrativa
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 capacidades administrativas. Você criará uma classe Admin que herda de User, mas possui poderes especiais para gerenciar o inventário da biblioteca — adicionando novos livros e removendo os existentes.
Você organizará seu código em cinco 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. 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. Admins herdam todas as capacidades de usuário, 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 com estas verificações:- Se o livro não existir, retorna
"Book not found" - Se o livro estiver emprestado no momento, retorna
"Cannot remove: book is currently borrowed" - Caso contrário, remova-o e retorne
"Removed: [title]"
- Se o livro não existir, retorna
main.php— Inclua o arquivo Admin. Você receberá duas entradas: um ISBN e um título de livro.Crie uma
Librarye umAdmincom ID1e nome"AdminUser". Também crie umUserregular com ID2e nome"RegularUser".Crie um
Bookcom o ISBN fornecido, título e autor"Test Author". Realize estas operações e imprima cada resultado em uma nova linha:- Faça o admin adicionar o livro à biblioteca
- Faça o usuário regular pegar o livro emprestado
- Faça o admin tentar remover o livro (deve falhar — está emprestado)
- Faça o usuário regular devolver o livro
- Faça o admin remover o livro (deve ter sucesso agora)
- Faça o admin tentar remover o mesmo livro novamente (deve falhar — não encontrado)
Este desafio demonstra como a herança cria uma hierarquia natural — admins são usuários com privilégios extras. As verificações de segurança em removeBookFromLibrary garantem a integridade dos dados, evitando 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 Biblioteca (Library)
// TODO: Criar um Administrador (Admin) com ID 1 e nome "AdminUser"
// TODO: Criar um Usuário (User) comum com ID 2 e nome "RegularUser"
// TODO: Criar um Livro (Book) com o ISBN fornecido, título e autor "Test Author"
// TODO: Realizar estas operações e imprimir cada resultado em uma nova linha:
// 1. Fazer o administrador adicionar o livro à biblioteca
// 2. Fazer o usuário comum pegar o livro emprestado
// 3. Fazer o administrador tentar remover o livro (deve falhar - está emprestado)
// 4. Fazer o usuário comum devolver o livro
// 5. Fazer o administrador remover o livro (deve ter sucesso agora)
// 6. Fazer o administrador tentar remover o mesmo livro novamente (deve falhar - não encontrado)
?>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