หลายอินเทอร์เฟซใน OOP ของ PHP

PHP ไม่มีฟังก์ชันการสืบทอดหลายระดับ - แต่ละคลาสสามารถมีได้เพียงคลาสหลักหนึ่งคลาสเท่านั้น อย่างไรก็ตาม สำหรับอินเทอร์เฟซแล้วเรื่องนี้แตกต่างออกไป: แต่ละคลาสสามารถใช้งาน (implement) อินเทอร์เฟซได้ไม่จำกัดจำนวน โดยให้ระบุชื่ออินเทอร์เฟซคั่นด้วยเครื่องหมายจุลภาคหลังจากคำสำคัญ implements

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

มาลองทำดูในทางปฏิบัติ สมมติว่าเรามีอินเทอร์เฟซ iTetragon นอกเหนือจากอินเทอร์เฟซ iFigure เมธอดของอินเทอร์เฟซนี้จะถูกใช้งานโดยคลาส Quadrate และ Rectangle เนื่องจากพวกมันมีด้าน 4 ด้าน แต่คลาส Disk จะไม่ใช้งาน

ให้อินเทอร์เฟซ iTetragon อธิบาย เก็ตเตอร์สำหรับด้านทั้งสี่ของรูปสี่เหลี่ยม:

iTetragon.php<?php
  interface iTetragon
  {
    public function getA();
    public function getB();
    public function getC();
    public function getD();
  }
?>

สมมติว่าเรายังมีอินเทอร์เฟซ iFigure ซึ่งเราเคยสร้างไว้ก่อนหน้านี้:

iFigure.php<?php
  interface iFigure
  {
    public function getSquare();
    public function getPerimeter();
  }
?>

มาทำให้คลาส Quadrate ใช้งานสองอินเทอร์เฟซ โดยให้เราระบุ อินเทอร์เฟซทั้งสองคั่นด้วยเครื่องหมายจุลภาคหลังคำสำคัญ implements:

Quadrate.php<?php
  class Quadrate implements iFigure, iTetragon
  {
    // จะมีโค้ดการใช้งานอยู่ที่นี่
  }
?>

มาปรับปรุงคลาส Quadrate ของเราให้เสร็จสมบูรณ์ เพื่อให้มันใช้งานอินเทอร์เฟซ iTetragon เป็นที่เข้าใจได้ว่าสี่เหลี่ยมจัตุรัสของเราเป็นกรณีพิเศษ ของรูปสี่เหลี่ยม เพราะสี่เหลี่ยมจัตุรัส ทุกด้านมีความยาวเท่ากัน ดังนั้นเมธอดใหม่ทั้งหมด จะส่งคืนค่าเดียวกัน - ความกว้างของสี่เหลี่ยมจัตุรัส:

Quadrate.php<?php
  class Quadrate implements iFigure, iTetragon
  {
    private $a;
    
    public function __construct($a)
    {
      $this->a = $a;
    }
    
    public function getA()
    {
      return $this->a;
    }
    
    public function getB()
    {
      return $this->a;
    }
    
    public function getC()
    {
      return $this->a;
    }
    
    public function getD()
    {
      return $this->a;
    }
    
    public function getSquare()
    {
      return $this->a * $this->a;
    }
    
    public function getPerimeter()
    {
      return 4 * $this->a;
    }
  }
?>

เห็นได้ชัดว่าในสี่เหลี่ยมผืนผ้าไม่ได้ ทุกด้านจะเหมือนกัน มีเพียงด้านตรงข้ามเท่านั้นที่เท่ากัน ในกรณีนี้ เมธอดใหม่จะแตกต่างออกไปเล็กน้อย และในสี่เหลี่ยมคางหมู โดยทั่วไปแล้ว 4 ด้านจะมีความยาวต่างกันทั้งหมด

อย่างไรก็ตาม ไม่สำคัญว่าเราจะพิจารณารูปร่างอะไร - สิ่งสำคัญคือรูปร่างทั้งหมดเหล่านี้ จะมีเมธอดที่อธิบายไว้ (แม้ว่า รูปร่างบางรูปจะพิเศษ) และทำงาน ในลักษณะเดียวกัน

Задание 1

ทำให้คลาส Rectangle ใช้งานสองอินเทอร์เฟซด้วย: ทั้ง iFigure และ iTetragon

Задание 2

สร้างอินเทอร์เฟซ iCircle พร้อมเมธอด getRadius และ getDiameter

Задание 3

ทำให้คลาส Disk ใช้งานสองอินเทอร์เฟซด้วย: ทั้ง iFigure และ iCircle