Мероси гирифтан аз синф ва амалӣ кардани интерфейс дар ООП дар 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
  {
    
  }
?>

Дар ҳамон вақт мо медонем, ки синфи Programmer бояд интерфейси iProgrammer-ро амалӣ кунад:

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

Биёед мероси гирифтан аз синфи Employee ва амалӣ кардани интерфейси iProgrammer-ро якҷоя кунем:

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

Натиҷа ин хоҳад буд, ки синфи мо Programmer аз синфи 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-ро нусхабардорӣ накунед – бе нигоҳ кардан ба коди ман, ин синфро худ амалӣ кунед.