Dědičnost třídy a implementace rozhraní v OOP v PHP

Třída může dědit od jiné třídy a zároveň implementovat nějaké rozhraní. Podívejme se na praktický příklad.

Řekněme, že chceme vytvořit třídu Programmer, která bude mít jméno, plat a seznam jazyků, které programátor ovládá. Zatím je náš popis třídy velmi vágní: ano, třída bude mít jméno, plat, jazyky - ale jaké metody bude naše třída mít?

Pojďme naši třídu popsat přesněji pomocí rozhraní iProgrammer:

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

Řekněme, že jsme prohledali naše již implementované třídy a ukázalo se, že už máme podobnou třídu Employee. Neimplementuje všechny metody třídy Programmer, ale část. Zde je kód naší již existující třídy:

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é v našem případě udělat to, aby naše nová třída Programmer zdědila část potřebných metod od třídy Employee (a část pak implementujeme už v samotné nové třídě):

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

Zároveň víme, že třída Pogrammer by měla implementovat rozhraní iProgrammer:

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

Pojďme zkombinovat dědičnost od třídy Employee a implementaci rozhraní iProgrammer:

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

Výsledkem bude, že naše třída Pogrammer zdědí od třídy Employee metody __construct, getName a getSalary, zatímco metody addLang a getLangs budeme muset implementovat:

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

Rozhraní iProgrammer je jedno, zda jsou metody původní nebo zděděné - hlavní je, aby všechny popsané metody byly implementovány.

Задание 1

Zkopírujte kód mé třídy Employee a kód rozhraní iProgrammer. Nekopírujte mou přípravku třídy Programmer - bez nahlížení do mého kódu implementujte tuto třídu samostatně.