Moștenirea de la o clasă și implementarea unei interfețe în OOP în PHP

O clasă poate moșteni de la o altă clasă și în același timp poate implementa o interfață. Să analizăm un exemplu practic.

Să presupunem că vrem să creăm o clasă Programmer, care să aibă un nume, un salariu și o listă de limbaje, pe care le cunoaște programatorul. Descrierea clasei noastre este încă foarte vagă: da, în clasă vor fi numele, salariul, limbajele - dar ce metode vor fi în clasa noastră?

Să descriem clasa noastră mai precis cu ajutorul interfeței iProgrammer:

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

Să presupunem că am căutat printre clasele deja implementate de noi și, se pare, avem deja o clasă similară Employee. Ea nu implementează toate metodele clasei Programmer, dar o parte. Iată codul clasei noastre deja existente:

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

Este logic în cazul nostru să facem astfel încât noua noastră clasă Programmer să moștenească o parte din metodele necesare de la clasa Employee (iar o parte o vom implementa ulterior în noua clasă):

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

În același timp, știm că clasa Pogrammer trebuie să implementeze interfața iProgrammer:

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

Să combinăm moștenirea de la clasa Employee și implementarea interfeței iProgrammer:

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

Se va dovedi că clasa noastră Pogrammer va moșteni de la clasa Employee metodele __construct, getName și getSalary, iar metodele addLang și getLangs va trebui să le implementăm noi:

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

Interfeței iProgrammer nu îi pasă, metodele sunt native pentru clasă sau moștenite - principalul este ca toate metodele descrise să fie implementate.

Задание 1

Copiați codul clasei mele Employee și codul interfeței iProgrammer. Nu copiați schița mea a clasei Programmer - fără să vă uitați la codul meu, implementați această clasă independent.