การสืบทอดจากคลาสและการใช้งานอินเทอร์เฟซใน OOP ใน 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 จะสืบทอดเมธอด __construct, getName และ getSalary จากคลาส Employee และเมธอด addLang และ getLangs เราจะต้องเขียนเอง:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    public function addLang($lang)
    {
      // การเขียนโค้ด
    }
    
    public function getLangs()
    {
      // การเขียนโค้ด
    }
  }
?>

อินเทอร์เฟซ iProgrammer ไม่สนใจว่า เมธอดจะเป็นของคลาสเองหรือสืบทอดมา - สิ่งสำคัญคือเมธอดทั้งหมดที่อธิบายไว้ต้องถูกเขียนขึ้น

Задание 1

คัดลอกโค้ดคลาส Employee ของฉัน และโค้ดอินเทอร์เฟซ iProgrammer อย่าคัดลอก ต้นแบบคลาส Programmer ของฉัน - โดยไม่ต้องดูโค้ดของฉัน ให้เขียนคลาสนี้ด้วยตนเอง