Powtórzenie – hierarchia pracowników
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 26 z 91.
Wyzwanie
ŁatwyZbudujmy system hierarchii pracowników, który łączy wszystkie poznane przez Ciebie w tym rozdziale koncepcje dziedziczenia. Utworzysz abstrakcyjną klasę bazową, która określa, co musi mieć każdy pracownik, a następnie rozszerzysz ją o wyspecjalizowane typy pracowników obliczające premie na różne sposoby.
Rozmieścisz swój kod w czterech plikach:
Employee.php: Zdefiniuj abstrakcyjną klasęEmployee, która będzie podstawą dla wszystkich typów pracowników. Powinna mieć chronione właściwości$namei$salary. Konstruktor przyjmuje obie wartości i je ustawia. Dodaj metodęgetName(), która zwraca imię, metodęgetSalary(), która zwraca wynagrodzenie, oraz metodę abstrakcyjnącalculateBonus(), którą muszą zaimplementować klasy potomne. Dodaj też metodęgetSummary(), która zwraca"[name] earns $[salary] with bonus: $[bonus]", gdzie[bonus]jest wynikiem wywołaniacalculateBonus().Manager.php: Zdefiniuj klasęManager, która rozszerzaEmployee. Na początku dołącz plik Employee. Menedżerowie otrzymują premię wyliczaną procentowo. Dodaj chronioną właściwość$bonusPercentage. Konstruktor powinien przyjmować imię, wynagrodzenie i procent premii: dla dwóch pierwszych wartości użyjparent::__construct(), a następnie samodzielnie ustaw procent premii. ZaimplementujcalculateBonus(), aby zwracała wynagrodzenie pomnożone przez procent premii i podzielone przez 100.Developer.php: Zdefiniuj klasęDeveloper, która rozszerzaEmployee. Na początku dołącz plik Employee. Deweloperzy otrzymują stałą premię za ukończenie projektu. Dodaj chronioną właściwość$projectBonus. Konstruktor powinien przyjmować imię, wynagrodzenie i kwotę premii za projekt: dla dwóch pierwszych wartości użyjparent::__construct(), a następnie samodzielnie ustaw premię za projekt. ZaimplementujcalculateBonus(), aby po prostu zwracała stałą kwotę premii za projekt.main.php: Dołącz pliki Manager i Developer. Otrzymasz sześć danych wejściowych: imię menedżera, wynagrodzenie menedżera, procent premii menedżera, imię dewelopera, wynagrodzenie dewelopera i premię dewelopera za projekt. Utwórz obiektManageri obiektDeveloperz użyciem tych wartości. Wypisz wynik wywołaniagetSummary()najpierw dla menedżera, a następnie dla dewelopera, każdy w osobnym wierszu.
To wyzwanie pokazuje, jak klasy abstrakcyjne wymuszają przestrzeganie kontraktu: każdy pracownik musi umieć obliczyć swoją premię, ale logika obliczeń różni się w zależności od stanowiska. Klasa Manager używa procentu wynagrodzenia, natomiast klasa Developer otrzymuje stałą kwotę. Wspólna metoda getSummary() w klasie nadrzędnej działa bezproblemowo z każdym sposobem obliczania premii dzięki polimorfizmowi.
Spróbuj swoich sił
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Odczytaj dane wejściowe
$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: Utwórz obiekt Manager na podstawie danych wejściowych menedżera
// TODO: Utwórz obiekt Developer na podstawie danych wejściowych programisty
// TODO: Wyświetl podsumowanie menedżera (getSummary())
// TODO: Wyświetl podsumowanie programisty (getSummary())
?>Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online