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 criar 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 todo funcionário deve ter e, em seguida, a estenderá com tipos especializados de funcionários que calculam bônus de maneiras diferentes.
Você organizará seu código em quatro arquivos:
Employee.php: Defina uma classe abstrataEmployeeque sirva 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 retorne o nome, um métodogetSalary()que retorne o salário e um método abstratocalculateBonus()que as classes filhas devem implementar. Adicione também um métodogetSummary()que retorne"[name] earns $[salary] with bonus: $[bonus]", em que[bonus]é o resultado da chamada decalculateBonus().Manager.php: Defina uma classeManagerque estendaEmployee. Inclua o arquivo Employee no início. Gerentes recebem um bônus baseado em porcentagem. Adicione uma propriedade protegida$bonusPercentage. O construtor deve aceitar nome, salário e porcentagem do 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 do bônus, dividido por 100.Developer.php: Defina uma classeDeveloperque estendaEmployee. Inclua o arquivo Employee no início. Desenvolvedores recebem um bônus fixo pela conclusão do 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 você mesmo o bônus do projeto. ImplementecalculateBonus()para simplesmente retornar o valor fixo do bônus do projeto.main.php: Inclua os arquivos Manager e Developer. Você receberá seis entradas: nome do gerente, salário do gerente, porcentagem do bônus do gerente, nome do desenvolvedor, salário do desenvolvedor e bônus do projeto do desenvolvedor. Crie umManagere umDevelopercom esses valores. Imprima o resultado da chamada degetSummary()no gerente primeiro e, depois, no desenvolvedor, cada um em sua própria linha.
Este desafio demonstra como as classes abstratas impõem um contrato: todo 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 do próprio 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 por meio do polimorfismo.
Experimente você mesmo
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Ler 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 manager
// TODO: Criar um objeto Developer com as entradas do developer
// TODO: Imprimir o resumo do manager (getSummary())
// TODO: Imprimir o resumo do developer (getSummary())
?>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