Dedenie od triedy a implementácia rozhrania v OOP v PHP

Trieda môže dediť od inej triedy a zároveň implementovať nejaké rozhranie. Pozrime sa na praktický príklad.

Povedzme, že chceme vytvoriť triedu Programmer, ktorá bude mať meno, plat a zoznam jazykov, ktoré programátor ovláda. Zatiaľ je náš popis triedy pomerne vágny: áno, trieda bude mať meno, plat, jazyky - ale aké metódy bude naša trieda obsahovať?

Poďme našu triedu opísať presnejšie pomocou rozhrania iProgrammer:

iProgrammer.php<?php
  interface iProgrammer
  {
    public function __construct($name, $salary);
    public function getName();
    public function getSalary();
    public function getLangs();
    public function addLang($lang);
  }
?>

Povedzme, že sme prehľadali už implementované triedy a zistili sme, že už máme podobnú triedu Employee. Neimplementuje všetky metódy triedy Programmer, ale časť. Tu je kód už existujúcej triedy:

Employee.php<?php
  class Employee
  {
    private $name;
    private $salary;
    
    public function __construct($name, $salary)
    {
      $this->name = $name;
      $this->salary = $salary;
    }
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getSalary()
    {
      return $this->salary;
    }
  }
?>

Je logické, aby naša nová trieda Programmer zdedila časť potrebných metód od triedy Employee (a zvyšok potom implementujeme priamo v novej triede):

Programmer.php<?php
  class Programmer extends Employee
  {
    
  }
?>

Zároveň vieme, že trieda Programmer by mala implementovať rozhranie iProgrammer:

Programmer.php<?php
  class Programmer implements iProgrammer
  {
    
  }
?>

Spojme teraz dedenie od triedy Employee a implementáciu rozhrania iProgrammer:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    
  }
?>

Výsledkom bude, že naša trieda Programmer zdedí od triedy Employee metódy __construct, getName a getSalary, zatiaľ čo metódy addLang a getLangs budeme musieť implementovať:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    public function addLang($lang)
    {
      // implementácia
    }
    
    public function getLangs()
    {
      // implementácia
    }
  }
?>

Rozhraniu iProgrammer je jedno, či sú metódy pôvodné alebo zdedené - dôležité je, aby boli všetky popísané metódy implementované.

Задание 1

Skopírujte kód mojej triedy Employee a kód rozhrania iProgrammer. Nekopírujte môj náčrt triedy Programmer - bez nahliadnutia do môjho kódu implementujte túto triedu samostatne.