PHP เบื้องต้น > Object Oriented Programming
การขยายอ๊อบเจค
Object oriented programming มีความสามารถในการห่อหุ้มข้อมูลเป็นประเภทข้อมูลใหม่ เมื่อมีการสร้าง Employee class ขึ้นมา ที่อินเฮอริตคุณสมบัติของพนักงานขึ้นมาได้
อินเฮอริต
ในทางปฏิบัติ ข้อมูลหลายประเภทอาจจะมีจำกัดขอบเขตผู้เข้าถึง เช่น ระบบจ่ายเงินเดือน ระบบโบนัส สิ่งเหล่านี้ไม่จำเป็นต้องเข้าสู่ระบบรวม แต่สามารถแบ่งส่วนออกมาได้
ถ้า class เป็น subclass ของอีก class สามารถใช้คีย์เวิร์ด extend เพื่อระบุการขยาย คำสั่งต่อไปนี้สร้าง Bonus class ที่อินเฮอริตจาก Employee class
<?php
class Bonus Extends Employee
{
protected static $bonus_rate = 1;
}
?>
การอินเฮอริตทำงานเพียง 1 ทิศทาง subclass หรือลูกอินเฮอริตส่วนการทำงานจากแม่หรือ class ฐาน แต่แม่ไม่สามารถใช้ส่วนการทำงานของลูก
Overriding
การให้ class ลูกสามารถปรับปรุงข้อมูลจากการ class ฐานหรือแม่ ตัวอย่าง Bonus class สามารถเพิ่มอัตราโบนัสเป็นพารามิเตอร์ PHP ยอมให้ทำได้และใช้ constructor จาก class ฐานด้วยการใช้คีย์เวิร์ด parent โดยรวมกับ scope resolution operator เพื่อเรียกเมธอดจาก class ฐาน วิธีนี้เรียกว่า Overriding เมธอดจาก class ฐาน ได้รับการแทนที่โดยเมธอดใหม่ของ class
<?php
class Bonus Extends Employee
{
protected $bonus_rate = 0.5;
public function __construct($m_empid, $m_empfname, $m_emplname, $m_sex, $m_salary, $m_nation, $m_bonus)
{
parent::__construct($m_empid, $m_empfname,
$m_emplname, $m_sex, $m_salary, $m_nation);
$this->bonus_rate = $m_bonus;
}
}
?>
เมธอด destructor ควรได้รับ overriding
<?php
public function __destruct()
{
// ควรเรียก destructor จากแม่
parent::__destruct();
} ?>
เมื่อ Bonus class ทำงานได้แล้ว ควรมีการปรับปรุงเมธอด get_EmployeePayroll() ใหม่ด้วยการ overriding จาก class ฐาน
<?php
public function get_EmployeePayroll()
{
return parent::get_EmployeeSalary()*(1+ $this->bonus_rate);
}
?>
การทำให้ Class ทำงานเหมือนกัน
หลักการสำคัญของ Object oriented programming ประการหนึ่งคือ ทำให้อินเตอร์เฟซเหมือนกันหรือ polymorphism ดังนั้นจึงต้องทำให้คำสั่งได้รับการเปลี่ยนแปลงนอกเหนือการควบคุม
โครงสร้างตามลำดับชั้นของ Class
โครงสร้างตามลำดับของสามารถขยายตามแนวดิ่งได้ด้วยอินเฮอริตได้ และสามารถปรับปรุงเมธอดจาก class ฐานด้วยการ overriding ได้สำหรับความเหมาะสมในการทำงาน ดังนั้นเมธอดบน class ฐานควรทำหน้าที่เป็นต้นแบบ (template) การกำหนดนี้ทำได้ด้วยการใช้คีย์เวิร์ด abstract
<?php
abstract class Employee
{
// คำสั่งอื่น...
}
?>
การป้องกันอินเฮอริตและ Overriding
บางเมธอดหรือ class อาจจะเกิดจากโครงสร้างตามลำดับชั้นของอ๊อบเจค ตัวอย่าง ป้องกันไม่ให้บุคคลทั่วไป overriding เมธอด get_EmployeeID ใน Employee class
การป้องกันใช้ คีย์เวิร์ด final
<?php
abstract class Employee
{
// คำสั่งอื่น...
final public function get_EmployeeID()
{
return $this->id;
}
}
?>
|