Dziedziczenie po klasie i implementacja interfejsu w OOP w PHP

Klasa może dziedziczyć po innej klasie i jednocześnie implementować jakiś interfejs. Rozważmy na praktycznym przykładzie.

Załóżmy, że chcemy utworzyć klasę Programmer, która będzie miała imię, wynagrodzenie i listę języków, które programista zna. Na razie nasz opis klasy jest dość rozmyty: tak, w klasie będzie imię, wynagrodzenie, języki - ale jakie metody będą w naszej klasie?

Opiszmy naszą klasę dokładniej za pomocą interfejsu iProgrammer:

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

Załóżmy, że przejrzeliśmy już przez zaimplementowane przez nas klasy i, okazuje się, że mamy już podobną klasę Employee. Nie implementuje ona wszystkich metod klasy Programmer, ale część. Oto kod już istniejącej u nas klasy:

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;
    }
  }
?>

Logiczne w naszym przypadku jest, aby nasza nowa klasa Programmer odziedziczyła część potrzebnych sobie metod po klasie Employee (a część zaimplementujemy później już w samej nowej klasie):

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

Przy tym wiemy, że klasa Pogrammer powinna implementować interfejs iProgrammer:

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

Połączmy dziedziczenie po klasie Employee i implementację interfejsu iProgrammer:

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

Okaże się, że nasza klasa Pogrammer odziedziczy po klasie Employee metody __construct, getName i getSalary, a metody addLang i getLangs będziemy musieli zaimplementować:

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

Dla interfejsu iProgrammer nie ma znaczenia, czy metody są natywne dla klasy, czy odziedziczone - główne, aby wszystkie opisane metody były zaimplementowane.

Задание 1

Skopiuj kod mojej klasy Employee i kod interfejsu iProgrammer. Nie kopiuj mojego szablonu klasy Programmer - nie podglądając w mój kod zaimplementuj tę klasę samodzielnie.