Наследување од класа и имплементација на интерфејс во ООП во 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 - без да го гледате мојот код имплементирајте ја оваа класа самостојно.