แนวคิดการเขียนโปรแกรมเชิงวัตถุ (OOP) ในภาษา PHP พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
การเขียนโปรแกรมเชิงวัตถุใน PHP นั้นจำลองแอปพลิเคชันโดยใช้สิ่งของในโลกแห่งความเป็นจริง โดยใช้คลาสและอ็อบเจ็กต์ คู่มือนี้จะอธิบายหลักการของ OOP ได้แก่ การห่อหุ้ม (encapsulation), การสืบทอด (inheritance) และความหลากหลายทางรูปแบบ (polymorphism) วิธีที่ PHP สนับสนุนหลักการเหล่านี้ และสร้างตัวอย่างการใช้งานคลาส การสืบทอด และอินเทอร์เฟซทีละขั้นตอน

OOP คืออะไร?
การเขียนโปรแกรมเชิงวัตถุ (Object-oriented programming) เป็นแนวทางการพัฒนาซอฟต์แวร์ที่จำลองแอปพลิเคชันโดยอิงจากวัตถุในโลกแห่งความเป็นจริง เช่น พนักงาน รถยนต์ และบัญชีธนาคาร คลาสจะกำหนดคุณสมบัติและเมธอดของวัตถุในโลกแห่งความเป็นจริง ส่วนวัตถุ (Object) คืออินสแตนซ์ของคลาส
องค์ประกอบพื้นฐานสามประการของการวางแนววัตถุ ได้แก่:
- การวิเคราะห์เชิงวัตถุ – การทำงานของระบบ
- การออกแบบเชิงวัตถุ – สถาปัตยกรรมของระบบ
- การเขียนโปรแกรมเชิงวัตถุ – การนำแอปพลิเคชันไปใช้
หลักการเขียนโปรแกรมเชิงวัตถุ
หลักการสำคัญสามประการของ OOP ได้แก่:
- encapsulation – แนวคิดนี้เกี่ยวข้องกับการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะวิธีการใช้งานเท่านั้น จุดประสงค์หลักของการห่อหุ้มข้อมูลคือ:
- ลดความซับซ้อนในการพัฒนาซอฟต์แวร์ – การใช้คลาสกลายเป็นเรื่องง่าย โดยการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะการดำเนินการ
- ปกป้องสถานะภายในของอ็อบเจ็กต์ – การเข้าถึงตัวแปรของคลาสทำได้ผ่านเมธอดต่างๆ เช่น get และ set ซึ่งทำให้คลาสมีความยืดหยุ่นและบำรุงรักษาได้ง่าย
- อนุญาตให้เปลี่ยนแปลงการใช้งานภายในของคลาสได้โดยไม่ต้องกังวลว่าจะทำให้โค้ดที่ใช้คลาสนั้นเสียหาย
- มรดก – หัวข้อนี้เกี่ยวข้องกับความสัมพันธ์ระหว่างคลาส ความสัมพันธ์นั้นอยู่ในรูปแบบของคลาสแม่และคลาสลูก โดยคลาสลูกจะใช้วิธีการที่กำหนดไว้ในคลาสแม่ จุดประสงค์หลักของการสืบทอดคือ:
- การนำกลับมาใช้ใหม่ได้ – คลาสลูกหลายคลาสสามารถสืบทอดคุณสมบัติจากคลาสแม่เดียวกันได้ ซึ่งมีประโยชน์มากเมื่อเราต้องจัดเตรียมฟังก์ชันการทำงานทั่วไป เช่น การเพิ่ม การอัปเดต และการลบข้อมูลจากฐานข้อมูล
- ความหลากหลาย – นี่คือเรื่องของการมีอินเทอร์เฟซเดียวแต่มีการใช้งานที่แตกต่างกันหลายแบบ จุดประสงค์หลักของโพลีมอร์ฟิซึมคือ:
- เพื่อลดความซับซ้อนในการบำรุงรักษาแอปพลิเคชันและทำให้สามารถขยายขีดความสามารถได้มากขึ้น
OOP Concepts ใน PHP
PHP เป็นภาษาสคริปต์เชิงวัตถุ และรองรับหลักการทั้งหมดข้างต้น หลักการข้างต้นบรรลุผลได้โดย:
- encapsulation - โดยใช้เมธอด "get" และ "set" รวมถึงตัวแก้ไขการเข้าถึง
- มรดก – โดยใช้คีย์เวิร์ด extends
- ความหลากหลาย – โดยการใช้คีย์เวิร์ด implements
ตอนนี้เรามีความรู้พื้นฐานเกี่ยวกับ OOP และวิธีการรองรับแล้ว PHPเรามาดูตัวอย่างที่นำหลักการข้างต้นไปใช้กันเถอะ
UML คืออะไร?
ภาษาสร้างแบบจำลองรวม (UML) เป็นเทคนิคที่ใช้ในการออกแบบและจัดทำเอกสารระบบเชิงวัตถุ
UML สร้างเอกสารหลายฉบับ แต่เราจะมาดูแผนภาพคลาส ซึ่งมีความสำคัญมากสำหรับการเขียนโปรแกรมเชิงวัตถุใน PHP
ตัวอย่างแผนผังชั้นเรียน
คีย์ไดอะแกรมคลาส
- การขอ กล่องด้านบน มีชื่อคลาส
- การขอ กล่องกลาง มีตัวแปรคลาส
- การขอ กล่องล่าง มีวิธีการเรียน
- การขอ ลบ (-) เครื่องหมายหมายถึงขอบเขตส่วนตัว
- การขอ บวก (+) เครื่องหมาย หมายถึง ขอบเขตสาธารณะ
- การขอ แฮช (#) เครื่องหมาย หมายถึง ขอบเขตที่ได้รับการคุ้มครอง
วิธีสร้างคลาสใน PHP
คีย์เวิร์ด class ใช้เพื่อกำหนดคลาสใน PHP ด้านล่างนี้เป็นกฎสำหรับการสร้างคลาสใน PHP
- ชื่อชั้นเรียนควรขึ้นต้นด้วยตัวอักษร
- ชื่อคลาสไม่สามารถเป็นคำสงวน PHP
- ชื่อคลาสไม่สามารถมีช่องว่างได้
สมมติว่าเราต้องการสร้างคลาสสำหรับแทนสัตว์ เราจะเริ่มต้นด้วยการระบุลักษณะทั่วไปที่พบในสัตว์ทุกชนิด
- สัตว์ทุกชนิดล้วนอยู่ในวงศ์ เช่น สัตว์กินพืช สัตว์กินเนื้อ เป็นต้น
- สัตว์ทุกตัวกินอาหาร
แผนภาพด้านล่างแสดงแผนภาพคลาสสำหรับสัตว์
ต่อไปเรามาเขียนโค้ดสำหรับคลาส Animal กันเถอะ
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
ที่นี่
- “private $family, $food” หมายความว่าไม่สามารถเข้าถึงตัวแปรเหล่านั้นได้โดยตรงจากภายนอกคลาส (การห่อหุ้มข้อมูล)
- “public function __construct($family…)” คือเมธอด constructor ของ PHP ฟังก์ชันนี้จะถูกเรียกใช้ทุกครั้งที่มีการสร้างอินสแตนซ์ของคลาส ในกรณีนี้ เรากำลังกำหนดค่าครอบครัวและอาหาร
- “public function get…()” คือเมธอดที่ใช้ในการเข้าถึงค่าของแฟมิลีหรือค่าของอาหาร (การห่อหุ้มข้อมูล)
- “public function set…()” คือเมธอดที่ใช้ในการกำหนดค่าของตระกูลหรือค่าของอาหาร (การห่อหุ้มข้อมูล)
วิธีการใช้งานการสืบทอดใน PHP
เราจะทำงานร่วมกับวัวและสิงโต ทั้งวัวและสิงโตสืบทอดมาจากคลาสสัตว์
แผนภาพชั้นเรียนด้านล่างแสดงความสัมพันธ์
โปรดสังเกตว่าคลาส Cow สืบทอดมาจากคลาส Animal และกำหนดตัวแปรและเมธอดของตัวเองด้วย
ต่อไปเรามาเขียนโค้ดสำหรับคลาส Cow กันเถอะ
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
ต่อไปนี้เรามาเขียนโค้ดสำหรับคลาส Lion กัน
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
ที่นี่
- คำสั่ง “class … extends Animal” ทำให้คลาส Cow และ Lion สามารถใช้เมธอดจากคลาส Animal ได้ (การสืบทอด)
วิธีการสร้างอ็อบเจ็กต์ของคลาส
คลาส Animal, Cow และ Lion ควรอยู่ในไดเร็กทอรีเดียวกันเพื่อความเรียบง่าย
ต่อไปนี้เราจะสร้างแอปพลิเคชันที่ใช้คลาสของเรากัน
ตัวอย่างคลาส PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
การทดสอบแอปพลิเคชันของเรา
ตอนนี้เรามาเปิดดูแอปพลิเคชันของเราในเว็บเบราว์เซอร์กัน
อ็อบเจ็กต์ทั้งสองใช้เมธอด get_family และ get_food ที่สืบทอดมาจากคลาส Animal ซึ่งแสดงให้เห็นถึงการสืบทอดคุณสมบัติ
วิธีนำ Polymorphism มาใช้ใน PHP
สมมติว่าเราต้องการพัฒนาแอปพลิเคชันที่เชื่อมต่อกับระบบฐานข้อมูลต่างๆ เช่น MySQL และ SQL เซิร์ฟเวอร์แต่ใช้ส่วนต่อประสานแบบเดียวกัน เราสามารถสร้างส่วนต่อประสานที่กำหนดวิธีการมาตรฐานและค่าสัมบูรณ์ได้tracคลาส t ที่ใช้งานเมธอดทั่วไป
- อินเตอร์เฟซ – มันคล้ายกับชั้นเรียน มันกำหนดวิธีการและพารามิเตอร์เท่านั้น
- abstract-class – เป็นคลาสที่ไม่สามารถใช้สร้างวัตถุได้โดยตรง จุดประสงค์คือเพื่อให้มีการนำวิธีการทั่วไปไปใช้บางส่วนหรือทั้งหมด
แผนภาพคลาสที่แสดงด้านล่างแสดงให้เห็นถึงความสัมพันธ์ระหว่างตัวแปร abs ของเราtracคลาส t, อินเทอร์เฟซ และคลาสการใช้งาน
มาเริ่มสร้างกล้ามหน้าท้องกันเถอะtracคลาส t
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
ที่นี่
- “กล้ามท้อง”trac“คลาส t” หมายความว่าไม่สามารถใช้คลาสดังกล่าวสร้างวัตถุได้โดยตรง
- “$host, $db…” เป็นตัวแปรคลาสที่ใช้ร่วมกันได้ในทุกการใช้งาน
- “ฟังก์ชัน __construct(…)” คือเมธอดตัวสร้างคลาสที่กำหนดค่าตัวแปรทั่วไปเมื่อเริ่มต้นใช้งาน
ต่อไปนี้เราจะสร้างอินเทอร์เฟซที่ประกอบด้วยเมธอดมาตรฐาน ซึ่งจะถูกนำไปใช้ในรูปแบบที่แตกต่างกันไปขึ้นอยู่กับเอนจินฐานข้อมูล
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
ที่นี่
- “อินเทอร์เฟซ” เป็นคำสำคัญสำหรับการสร้างอินเทอร์เฟซ
- “หน้าที่สาธารณะ…(…)” เป็นวิธีการมาตรฐานที่ควรนำไปใช้
ต่อไปนี้เราจะสร้างคลาสที่เป็นรูปธรรมที่จะสืบทอดจากคลาส DBCommonMethods และใช้งานอินเทอร์เฟซ DBInterface ก่อนอื่นเลย MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
จากนั้น ไฟล์ MSSQLServerDriver.php:
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
ที่นี่
- “class … extends DBCommonMethods” ใช้เมธอดใน DBCommonMethods
- “… implements DBInterface” ช่วยให้มั่นใจได้ว่าคลาสนี้มีเมธอดมาตรฐานไม่ว่าจะใช้ไดรเวอร์ฐานข้อมูลใดก็ตาม
โค้ดที่ใช้คลาสข้างต้นจะมีลักษณะดังนี้:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
หรือ:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
ส่วนที่เหลือของโค้ดจะเหมือนกันสำหรับไดรเวอร์ทั้งสองแบบ เช่น:
<?php $db->db_connect(); $db->insert($data); ?>
นี่คือตัวอย่างของโพลีมอร์ฟิซึม: การเรียกใช้เมธอดแบบเดียวกันจะใช้ได้กับไดรเวอร์ใดๆ ก็ตามที่ใช้งานอินเทอร์เฟซนั้น ดังนั้นโค้ดโดยรอบจึงไม่เปลี่ยนแปลงเมื่อคุณเปลี่ยนไปใช้เอนจินฐานข้อมูลอื่น





