การสืบทอดจากคลาสและการใช้งานอินเทอร์เฟซใน OOP ใน PHP
คลาสสามารถสืบทอดจากคลาสอื่นได้ และในขณะเดียวกันก็สามารถใช้งานอินเทอร์เฟซบางตัวได้ ลองดูตัวอย่างเชิงปฏิบัติ
สมมติว่าเราต้องการสร้างคลาส Programmer
ซึ่งจะมีชื่อ เงินเดือน และรายการภาษาที่โปรแกรมเมอร์รู้จัก
ขณะนี้อธิบายคลาสของเรายังคลุมเครือมาก:
ใช่ ในคลาสจะมีชื่อ เงินเดือน ภาษา -
แต่จะมีเมธอดอะไรบ้างในคลาสของเรา?
เรามาอธิบายคลาสของเราให้แม่นยำยิ่งขึ้นโดยใช้
อินเทอร์เฟซ iProgrammer:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
สมมติว่าเราค้นหาจากคลาสที่เราเขียนไว้แล้ว
และปรากฎว่ามีคลาส Employee ที่คล้ายกันอยู่แล้ว
มันไม่ได้มีเมธอดทั้งหมดเหมือนคลาส Programmer แต่มีบางส่วน
นี่คือโค้ดของคลาสที่มีอยู่แล้วของเรา:
<?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 (และบางส่วนเราจะมาเขียนเอง
ในคลาสใหม่นี้):
<?php
class Programmer extends Employee
{
}
?>
ในขณะเดียวกันเรารู้ว่าคลาส Programmer
ควรใช้งานอินเทอร์เฟซ
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
ลองรวมการสืบทอดจากคลาส
Employee และการใช้งานอินเทอร์เฟซ
iProgrammer:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
จะได้ว่า คลาสของเรา Programmer
จะสืบทอดเมธอด
__construct, getName และ getSalary จากคลาส Employee
และเมธอด addLang และ getLangs
เราจะต้องเขียนเอง:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// การเขียนโค้ด
}
public function getLangs()
{
// การเขียนโค้ด
}
}
?>
อินเทอร์เฟซ iProgrammer ไม่สนใจว่า
เมธอดจะเป็นของคลาสเองหรือสืบทอดมา
- สิ่งสำคัญคือเมธอดทั้งหมดที่อธิบายไว้ต้องถูกเขียนขึ้น
คัดลอกโค้ดคลาส Employee ของฉัน
และโค้ดอินเทอร์เฟซ iProgrammer อย่าคัดลอก
ต้นแบบคลาส Programmer ของฉัน -
โดยไม่ต้องดูโค้ดของฉัน ให้เขียนคลาสนี้ด้วยตนเอง