Rückblick – Mitarbeiterhierarchie
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 26 von 91.
Aufgabe
EinfachErstellen wir ein Hierarchiesystem für Mitarbeiter, das alle Vererbungskonzepte zusammenführt, die du in diesem Kapitel gelernt hast. Du erstellst eine abstrakte Basisklasse, die festlegt, was jeder Mitarbeiter haben muss, und erweiterst sie anschließend um spezialisierte Mitarbeitertypen, die Boni unterschiedlich berechnen.
Du organisierst deinen Code über vier Dateien:
Employee.php: Definiere eine abstrakte KlasseEmployee, die als Grundlage für alle Mitarbeitertypen dient. Sie sollte die geschützten Eigenschaften$nameund$salarybesitzen. Der Konstruktor akzeptiert beide Werte und setzt sie. Füge eine MethodegetName()hinzu, die den Namen zurückgibt, eine MethodegetSalary(), die das Gehalt zurückgibt, sowie eine abstrakte MethodecalculateBonus(), die Kindklassen implementieren müssen. Füge außerdem eine MethodegetSummary()hinzu, die"[name] earns $[salary] with bonus: $[bonus]"zurückgibt, wobei[bonus]das Ergebnis des Aufrufs voncalculateBonus()ist.Manager.php: Definiere eine KlasseManager, dieEmployeeerweitert. Binde die Employee-Datei am Anfang ein. Manager erhalten einen prozentualen Bonus. Füge eine geschützte Eigenschaft$bonusPercentagehinzu. Der Konstruktor sollte Name, Gehalt und Bonusprozentsatz akzeptieren: Verwendeparent::__construct()für die ersten beiden Werte und setze den Prozentsatz anschließend selbst. ImplementierecalculateBonus()so, dass das Gehalt multipliziert mit dem Bonusprozentsatz, geteilt durch 100, zurückgegeben wird.Developer.php: Definiere eine KlasseDeveloper, dieEmployeeerweitert. Binde die Employee-Datei am Anfang ein. Entwickler erhalten einen festen Bonus für den Projektabschluss. Füge eine geschützte Eigenschaft$projectBonushinzu. Der Konstruktor sollte Name, Gehalt und den Bonusbetrag für den Projektabschluss akzeptieren: Verwendeparent::__construct()für die ersten beiden Werte und setze den Projektbonus anschließend selbst. ImplementierecalculateBonus(), sodass einfach der feste Bonusbetrag für das Projekt zurückgegeben wird.main.php: Binde sowohl die Manager- als auch die Developer-Datei ein. Du erhältst sechs Eingaben: den Namen des Managers, das Gehalt des Managers, den Bonusprozentsatz des Managers, den Namen des Entwicklers, das Gehalt des Entwicklers und den Projektbonus des Entwicklers. Erstelle mit diesen Werten einenManagerund einenDeveloper. Gib zuerst das Ergebnis des Aufrufs vongetSummary()für den Manager und anschließend für den Entwickler aus, jeweils in einer eigenen Zeile.
Diese Aufgabe zeigt, wie abstrakte Klassen einen Vertrag erzwingen: Jeder Mitarbeiter muss seinen Bonus berechnen können, aber die Berechnungslogik unterscheidet sich je nach Rolle. Der Manager verwendet einen Prozentsatz seines Gehalts, während der Developer einen festen Betrag erhält. Die gemeinsame Methode getSummary() in der übergeordneten Klasse funktioniert dank Polymorphie nahtlos mit beiden Bonusberechnungen.
Probier es selbst
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Eingaben lesen
$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: Erstelle ein Manager-Objekt mit den Manager-Eingaben
// TODO: Erstelle ein Developer-Objekt mit den Developer-Eingaben
// TODO: Gib die Zusammenfassung des Managers aus (getSummary())
// TODO: Gib die Zusammenfassung des Developers aus (getSummary())
?>Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler