Наследяване от клас и имплементация на интерфейс в ООП в PHP

Един клас може да наследява от друг клас и в същото време да имплементира някакъв интерфейс. Нека разгледаме с практически пример.

Да приемем, че искаме да създадем клас Programmer, който има име, заплата и списък с езици, които програмистът знае. Засега нашето описание на класа е доста неясно: да, в класа ще има име, заплата, езици - но кои методи ще има в нашия клас?

Нека опишем нашия клас по-точно с помощта на интерфейс iProgrammer:

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

Да приемем, че разгледахме вече реализираните от нас класове и се оказва, че вече имаме подобен клас Employee. Той не имплементира всички методи на класа Programmer, но част от тях. Ето кода на вече съществуващия при нас клас:

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

Логично в нашия случай е да направим така, че нашият нов клас Programmer да наследи част от необходимите си методи от класа Employee (а останалата част ще ги имплементираме вече в самия нов клас):

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

Освен това знаем, че класът Pogrammer трябва да имплементира интерфейса iProgrammer:

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

Нека комбинираме наследяването от клас Employee и имплементацията на интерфейса iProgrammer:

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

Така ще се получи, че нашият клас Pogrammer ще наследи от класа Employee методите __construct, getName и getSalary, а методите addLang и getLangs ще трябва да ги имплементираме ние:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    public function addLang($lang)
    {
      // имплементация
    }
    
    public function getLangs()
    {
      // имплементация
    }
  }
?>

На интерфейса iProgrammer не му пука дали методите са родни за класа или наследени - важно е всички описани методи да са имплементирани.

Задание 1

Копирайте кода на моя клас Employee и кода на интерфейса iProgrammer. Не копирайте моята заготовка на клас Programmer - без да надничате в моя код, имплементирайте този клас самостоятелно.