Resumen - 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ácilVamos a construir 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 defina lo que todo empleado debe tener, y luego la extenderás con tipos de empleados especializados que calculan los bonos de manera diferente.
Organizarás tu código en cuatro archivos:
Employee.php— Define una clase abstractaEmployeeque sirva como base para todos los tipos de empleados. Debe tener propiedades protegidas$namey$salary. El constructor acepta ambos valores y los asigna. Incluye un métodogetName()que devuelva el nombre, un métodogetSalary()que devuelva el salario y un método abstractocalculateBonus()que las clases hijas deben implementar. También añade un métodogetSummary()que devuelva"[name] earns $[salary] with bonus: $[bonus]"donde[bonus]es el resultado de llamar acalculateBonus().Manager.php— Define una claseManagerque extienda deEmployee. Incluye el archivo Employee al principio. Los gerentes reciben un bono basado en un porcentaje. Añade una propiedad protegida$bonusPercentage. El constructor debe aceptar el nombre, el salario y el porcentaje de bono — usaparent::__construct()para los dos primeros, luego asigna el porcentaje tú mismo. ImplementacalculateBonus()para devolver el salario multiplicado por el porcentaje de bono dividido por 100.Developer.php— Define una claseDeveloperque extienda deEmployee. Incluye el archivo Employee al principio. Los desarrolladores reciben un bono fijo por finalización de proyecto. Añade una propiedad protegida$projectBonus. El constructor debe aceptar el nombre, el salario y el monto del bono por proyecto — usaparent::__construct()para los dos primeros, luego asigna el bono por proyecto tú mismo. ImplementacalculateBonus()para que simplemente devuelva el monto fijo del bono por proyecto.main.php— Incluye tanto el archivo Manager como el de Developer. Recibirás cinco entradas: nombre del gerente, salario del gerente, porcentaje de bono del gerente, nombre del desarrollador, salario del desarrollador y bono por proyecto del desarrollador. Crea unManagery unDevelopercon estos valores. Imprime el resultado de llamar agetSummary()primero para el gerente, luego para el desarrollador, cada uno en su propia línea.
Este desafío demuestra cómo las clases abstractas imponen un contrato: cada empleado debe poder calcular su bono, pero la lógica de cálculo varía según el rol. El Manager utiliza un porcentaje de su salario, mientras que el Developer obtiene una cantidad fija. El método compartido getSummary() en la clase padre funciona a la perfección con cualquiera de los cálculos de bonos a través del 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 gerente
// TODO: Crear un objeto Developer con las entradas del desarrollador
// TODO: Imprimir el resumen del gerente (getSummary())
// TODO: Imprimir el resumen del desarrollador (getSummary())
?>Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy