วิธีใช้ Abstract Method ใน OOP ของ PHP
Abstract Class ยังสามารถมี Abstract Method ได้ด้วย เมธอดประเภทนี้จะต้องไม่มี implementation (ส่วนตัวของเมธอด) แต่มีไว้เพื่อระบุว่าเมธอดดังกล่าวจะต้องมีอยู่ในคลาสลูกหลาน และ การ implement เมธอดเหล่านี้เป็นหน้าที่ของคลาสลูกหลาน
เพื่อประกาศให้เมธอดเป็น abstract ในการประกาศเมธอดให้ใส่คีย์เวิร์ด abstract
มาลองฝึกปฏิบัติกัน สมมติว่าคลาสลูกทุกตัวของคลาส User จะต้องมีเมธอด increaseRevenue
เมธอดนี้ควรนำรายได้ปัจจุบันของผู้ใช้มาบวกเพิ่มด้วยจำนวนที่ส่งผ่านพารามิเตอร์
ตัวคลาส User เองไม่รู้ว่ารายได้ของคลาสลูกจะเป็นอะไร เพราะสำหรับพนักงานคือเงินเดือน ส่วนสำหรับนักเรียนคือทุนการศึกษา ดังนั้นคลาสลูกแต่ละตัวจะ implement เมธอดนี้ด้วยตัวเอง
ประเด็นคือ Abstract Method ของคลาส User บังคับให้โปรแกรมเมอร์ต้อง implement เมธอดนี้ในคลาสลูก มิฉะนั้น PHP จะแสดงข้อผิดพลาด ดังนั้น คุณหรือโปรแกรมเมอร์คนอื่นที่ทำงานกับโค้ดของคุณจะไม่มีทางลืม implement เมธอดที่จำเป็นในคลาสลูกได้
เอาล่ะ มาลองฝึกปฏิบัติกัน เพิ่ม Abstract Method increaseRevenue เข้าไปในคลาส User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstract method ที่ไม่มี body:
abstract public function increaseRevenue($value);
}
?>
ให้คลาส Employee ของเรายังคงเหมือนเดิมไม่เปลี่ยนแปลง ในกรณีนี้ ถึงจะไม่สร้างอ็อบเจกต์ของคลาส Employee แต่แค่รันโค้ดที่กำหนดคลาสของเรา PHP ก็จะแสดงข้อผิดพลาดแล้ว
ตอนนี้ให้เราเขียน implementation ของเมธอด increaseRevenue ในคลาส Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// เขียน implementation ของเมธอด:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
ทดสอบการทำงานของคลาสของเรา:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
implement เมธอด increaseRevenue ในคลาส Student ด้วย แต่คราวนี้เมธอดของเราจะเพิ่มทุนการศึกษา:
<?php
class Student extends User
{
private $scholarship; // ทุนการศึกษา
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// เมธอดเพิ่มทุนการศึกษา:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
เพิ่ม Abstract Method increaseRevenue แบบเดียวกันเข้าไปในคลาส User ของคุณ เขียน implementation ของเมธอดนี้ในคลาส Employee และ Student
ในคลาส Figure ให้สร้าง Abstract Method สำหรับหาพื้นที่และความยาวรอบรูป