Repaso - Jerarquía de empleados
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 26 de 91.
Desafío
FácilConstruyamos un sistema de jerarquía de empleados que reúna todos los conceptos de herencia que has aprendido en este capítulo. Crearás una clase base abstracta que define lo que todo empleado debe tener y, después, la extenderás con tipos de empleados especializados que calculan las bonificaciones de manera diferente.
Organizarás tu código en cuatro archivos:
Employee.php: Define una clase abstractaEmployeeque sirve de base para todos los tipos de empleados. Debe tener las propiedades protegidas$namey$salary. El constructor acepta ambos valores y los asigna. Incluye un métodogetName()que devuelve el nombre, un métodogetSalary()que devuelve el salario y un método abstractocalculateBonus()que las clases hijas deben implementar. Añade también un métodogetSummary()que devuelve"[name] earns $[salary] with bonus: $[bonus]", donde[bonus]es el resultado de llamar acalculateBonus().Manager.php: Define una claseManagerque extiendeEmployee. Incluye el archivo Employee al principio. Los gerentes reciben una bonificación basada en un porcentaje. Añade una propiedad protegida$bonusPercentage. El constructor debe aceptar el nombre, el salario y el porcentaje de bonificación: usaparent::__construct()para los dos primeros y, después, asigna tú mismo el porcentaje. ImplementacalculateBonus()para que devuelva el salario multiplicado por el porcentaje de bonificación y dividido entre 100.Developer.php: Define una claseDeveloperque extiendeEmployee. Incluye el archivo Employee al principio. Los desarrolladores reciben una bonificación fija por finalización del proyecto. Añade una propiedad protegida$projectBonus. El constructor debe aceptar el nombre, el salario y el importe de la bonificación del proyecto: usaparent::__construct()para los dos primeros y, después, asigna tú mismo la bonificación del proyecto. ImplementacalculateBonus()para que simplemente devuelva el importe fijo de la bonificación del proyecto.main.php: Incluye los archivos de Manager y Developer. Recibirás seis entradas: nombre del gerente, salario del gerente, porcentaje de bonificación del gerente, nombre del desarrollador, salario del desarrollador e importe de la bonificación del proyecto del desarrollador. Crea unManagery unDevelopercon estos valores. Imprime primero el resultado de llamar agetSummary()sobre el gerente y, después, sobre el desarrollador, cada uno en su propia línea.
Este desafío demuestra cómo las clases abstractas hacen cumplir un contrato: todo empleado debe poder calcular su bonificación, pero la lógica de cálculo varía según el puesto. El Manager utiliza un porcentaje de su salario, mientras que el Developer recibe un importe fijo. El método compartido getSummary() de la clase principal funciona perfectamente con cualquiera de los dos cálculos de bonificación mediante el polimorfismo.
Pruébalo tú mismo
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Leer 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: Crear un objeto Manager con las entradas del manager
// TODO: Crear un objeto Developer con las entradas del developer
// TODO: Imprimir el resumen del manager (getSummary())
// TODO: Imprimir el resumen del developer (getSummary())
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online