หลายอินเทอร์เฟซใน OOP ของ PHP
PHP ไม่มีฟังก์ชันการสืบทอดหลายระดับ - แต่ละคลาสสามารถมีได้เพียงคลาสหลักหนึ่งคลาสเท่านั้น
อย่างไรก็ตาม สำหรับอินเทอร์เฟซแล้วเรื่องนี้แตกต่างออกไป:
แต่ละคลาสสามารถใช้งาน (implement) อินเทอร์เฟซได้ไม่จำกัดจำนวน
โดยให้ระบุชื่ออินเทอร์เฟซคั่นด้วยเครื่องหมายจุลภาคหลังจากคำสำคัญ implements
นี่เป็นอีกหนึ่งข้อแตกต่างระหว่างอินเทอร์เฟซกับคลาสนามธรรม - คุณสามารถใช้งานอินเทอร์เฟซได้หลายอัน แต่ไม่สามารถสืบทอดจากคลาสนามธรรมได้หลายคลาส
มาลองทำดูในทางปฏิบัติ สมมติว่าเรามีอินเทอร์เฟซ iTetragon นอกเหนือจากอินเทอร์เฟซ iFigure
เมธอดของอินเทอร์เฟซนี้จะถูกใช้งานโดยคลาส Quadrate และ Rectangle
เนื่องจากพวกมันมีด้าน 4 ด้าน แต่คลาส Disk จะไม่ใช้งาน
ให้อินเทอร์เฟซ iTetragon อธิบาย
เก็ตเตอร์สำหรับด้านทั้งสี่ของรูปสี่เหลี่ยม:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
สมมติว่าเรายังมีอินเทอร์เฟซ iFigure
ซึ่งเราเคยสร้างไว้ก่อนหน้านี้:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
มาทำให้คลาส Quadrate
ใช้งานสองอินเทอร์เฟซ โดยให้เราระบุ
อินเทอร์เฟซทั้งสองคั่นด้วยเครื่องหมายจุลภาคหลังคำสำคัญ
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// จะมีโค้ดการใช้งานอยู่ที่นี่
}
?>
มาปรับปรุงคลาส Quadrate ของเราให้เสร็จสมบูรณ์
เพื่อให้มันใช้งานอินเทอร์เฟซ iTetragon
เป็นที่เข้าใจได้ว่าสี่เหลี่ยมจัตุรัสของเราเป็นกรณีพิเศษ
ของรูปสี่เหลี่ยม เพราะสี่เหลี่ยมจัตุรัส
ทุกด้านมีความยาวเท่ากัน ดังนั้นเมธอดใหม่ทั้งหมด
จะส่งคืนค่าเดียวกัน - ความกว้างของสี่เหลี่ยมจัตุรัส:
<?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 ด้านจะมีความยาวต่างกันทั้งหมด
อย่างไรก็ตาม ไม่สำคัญว่าเราจะพิจารณารูปร่างอะไร - สิ่งสำคัญคือรูปร่างทั้งหมดเหล่านี้ จะมีเมธอดที่อธิบายไว้ (แม้ว่า รูปร่างบางรูปจะพิเศษ) และทำงาน ในลักษณะเดียวกัน
ทำให้คลาส Rectangle
ใช้งานสองอินเทอร์เฟซด้วย: ทั้ง iFigure
และ iTetragon
สร้างอินเทอร์เฟซ iCircle พร้อมเมธอด
getRadius และ getDiameter
ทำให้คลาส Disk
ใช้งานสองอินเทอร์เฟซด้วย: ทั้ง iFigure
และ iCircle