Nasleđivanje od klase i implementacija interfejsa u OOP u PHP-u

Klasa može naslediti od druge klase i pritom implementirati neki interfejs. Razmotrimo na praktičnom primeru.

Neka želimo da napravimo klasu Programmer, koja će imati ime, platu i listu jezika koje programer poznaje. Trenutno je naš opis klase prilično nejasan: da, u klasi će biti ime, plata, jezici - ali koje će metode biti u našoj klasi?

Hajde da preciznije opišemo našu klasu pomoću interfejsa iProgrammer:

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

Recimo da smo pretražili već implementirane klase i, ispostavilo se, već imamo sličnu klasu Employee. Ona ne implementira sve metode klase Programmer, ali deo njih. Evo koda već postojeće klase kod nas:

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

Logično je u našem slučaju učiniti tako da naša nova klasa Programmer nasledi deo potrebnih metoda od klase Employee (a deo ćemo kasnije implementirati već u samoj novoj klasi):

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

Pritom nam je poznato da klasa Pogrammer treba da implementira interfejs iProgrammer:

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

Hajde da spojimo nasleđivanje od klase Employee i implementaciju interfejsa iProgrammer:

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

Ispostaviće se da će naša klasa Pogrammer naslediti od klase Employee metode __construct, getName i getSalary, a metode addLang i getLangs moraćemo da implementiramo:

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

Interfejsu iProgrammer je svejedno, rodne metode u klasi ili nasleđene - glavno je da svi opisani metodi budu implementirani.

Задание 1

Kopirajte kod moje klase Employee i kod interfejsa iProgrammer. Nemojte kopirati moju šablon klase Programmer - ne gledajući u moj kod implementirajte ovu klasu samostalno.