Recapitulação - Hierarquia de Funcionários
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 26 de 91.
Desafio
FácilVamos construir um sistema de hierarquia de funcionários que reúne todos os conceitos de herança que você aprendeu neste capítulo. Você criará uma classe base abstrata que define o que cada funcionário deve ter e, em seguida, a estenderá com tipos de funcionários especializados que calculam bônus de maneira diferente.
Você organizará seu código em quatro arquivos:
Employee.php— Defina uma classe abstrataEmployeeque serve como base para todos os tipos de funcionários. Ela deve ter as propriedades protegidas$namee$salary. O construtor aceita ambos os valores e os define. Inclua um métodogetName()que retorna o nome, um métodogetSalary()que retorna o salário e um método abstratocalculateBonus()que as classes filhas devem implementar. Adicione também um métodogetSummary()que retorna"[name] earns $[salary] with bonus: $[bonus]"onde[bonus]é o resultado da chamada decalculateBonus().Manager.php— Defina uma classeManagerque estendeEmployee. Inclua o arquivo Employee no topo. Os gerentes recebem um bônus baseado em porcentagem. Adicione uma propriedade protegida$bonusPercentage. O construtor deve aceitar nome, salário e porcentagem de bônus — useparent::__construct()para os dois primeiros e, em seguida, defina a porcentagem você mesmo. ImplementecalculateBonus()para retornar o salário multiplicado pela porcentagem de bônus dividida por 100.Developer.php— Defina uma classeDeveloperque estendeEmployee. Inclua o arquivo Employee no topo. Os desenvolvedores recebem um bônus fixo por conclusão de projeto. Adicione uma propriedade protegida$projectBonus. O construtor deve aceitar nome, salário e valor do bônus do projeto — useparent::__construct()para os dois primeiros e, em seguida, defina o bônus do projeto você mesmo. ImplementecalculateBonus()para simplesmente retornar o valor fixo do bônus do projeto.main.php— Inclua os arquivos Manager e Developer. Você receberá cinco entradas: nome do gerente, salário do gerente, porcentagem de bônus do gerente, nome do desenvolvedor, salário do desenvolvedor e bônus de projeto do desenvolvedor. Crie umManagere umDevelopercom esses valores. Imprima o resultado da chamada degetSummary()no gerente primeiro, depois no desenvolvedor, cada um em sua própria linha.
Este desafio demonstra como as classes abstratas impõem um contrato — cada funcionário deve ser capaz de calcular seu bônus, mas a lógica de cálculo varia de acordo com a função. O Manager usa uma porcentagem de seu salário, enquanto o Developer recebe um valor fixo. O método compartilhado getSummary() na classe pai funciona perfeitamente com qualquer cálculo de bônus através do polimorfismo.
Experimente você mesmo
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Ler as entradas
$managerName = trim(fgets(STDIN));
$managerSalary = floatval(trim(fgets(STDIN)));
$managerBonusPercentage = floatval(trim(fgets(STDIN)));
$developerName = trim(fgets(STDIN));
$developerSalary = floatval(trim(fgets(STDIN)));
$developerProjectBonus = floatval(trim(fgets(STDIN)));
// TODO: Criar um objeto Manager com as entradas do gerente
// TODO: Criar um objeto Developer com as entradas do desenvolvedor
// TODO: Imprimir o resumo do gerente (getSummary())
// TODO: Imprimir o resumo do desenvolvedor (getSummary())
?>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