บทช่วยสอนแนวคิดการเขียนโปรแกรมเชิงวัตถุ PHP (OOPs) พร้อมตัวอย่าง
OOP คืออะไร?
Object Oriented เป็นแนวทางในการพัฒนาซอฟต์แวร์ที่สร้างแบบจำลองแอปพลิเคชันรอบๆ วัตถุในโลกแห่งความเป็นจริง เช่น พนักงาน รถยนต์ บัญชีธนาคาร ฯลฯ คลาสจะกำหนดคุณสมบัติและวิธีการของวัตถุในโลกแห่งความเป็นจริง วัตถุเป็นการเกิดขึ้นของคลาส
องค์ประกอบพื้นฐานสามประการของการวางแนววัตถุ ได้แก่
- การวิเคราะห์เชิงวัตถุ – การทำงานของระบบ
- การออกแบบเชิงวัตถุ – สถาปัตยกรรมของระบบ
- การเขียนโปรแกรมเชิงวัตถุ – การนำแอปพลิเคชันไปใช้
หลักการเขียนโปรแกรมเชิงวัตถุ
หลักการสำคัญสามประการของ OOP คือ
- encapsulation – เกี่ยวข้องกับการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะวิธีการเท่านั้น วัตถุประสงค์หลักของการห่อหุ้มคือเพื่อ:
- ลดความซับซ้อนในการพัฒนาซอฟต์แวร์ – การใช้คลาสกลายเป็นเรื่องง่าย โดยการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะการดำเนินการ
- ปกป้องสถานะภายในของออบเจ็กต์ - การเข้าถึงตัวแปรคลาสทำได้ผ่านวิธีการต่างๆ เช่น รับและตั้งค่า ซึ่งทำให้คลาสมีความยืดหยุ่นและบำรุงรักษาง่าย
- การใช้งานภายในของคลาสสามารถเปลี่ยนแปลงได้โดยไม่ต้องกังวลกับการทำลายโค้ดที่ใช้คลาส
- มรดก – เกี่ยวข้องกับความสัมพันธ์ระหว่างชั้นเรียน ความสัมพันธ์อยู่ในรูปแบบของพ่อแม่และลูก เด็กใช้วิธีการที่กำหนดไว้ในชั้นเรียนผู้ปกครอง วัตถุประสงค์หลักของการรับมรดกคือ
- การนำกลับมาใช้ใหม่- รายการย่อยจำนวนหนึ่งสามารถสืบทอดมาจากผู้ปกครองคนเดียวกันได้ สิ่งนี้มีประโยชน์มากเมื่อเราต้องมีฟังก์ชันทั่วไป เช่น การเพิ่ม การอัปเดต และการลบข้อมูลจากฐานข้อมูล
- ความหลากหลาย – สิ่งนี้เกี่ยวข้องกับการมีรูปแบบเดียว แต่มีวิธีการนำไปใช้ที่แตกต่างกันมากมาย วัตถุประสงค์หลักของความหลากหลายคือ
- ลดความซับซ้อนในการบำรุงรักษาแอปพลิเคชันและทำให้ขยายได้มากขึ้น
OOP Concepts ใน PHP
PHP เป็นภาษาสคริปต์เชิงวัตถุ มันสนับสนุนหลักการข้างต้นทั้งหมด หลักการข้างต้นสามารถทำได้โดย;
- encapsulation – ผ่านการใช้วิธีการ “get” และ “set” เป็นต้น
- มรดก – ผ่านการใช้คำสำคัญขยาย
- ความหลากหลาย – ผ่านการใช้คำสำคัญ Implements
ตอนนี้เรามีความรู้พื้นฐานเกี่ยวกับ OOP และวิธีการรองรับแล้ว PHPให้เราดูตัวอย่างที่ใช้หลักการข้างต้น
UML คืออะไร?
Unified Modeling Language UML เป็นเทคนิคที่ใช้ในการออกแบบและจัดทำเอกสารระบบเชิงวัตถุ
UML สร้างเอกสารจำนวนหนึ่ง แต่เราจะดูที่แผนภาพคลาสซึ่งมีความสำคัญมากต่อการเขียนโปรแกรม PHP เชิงวัตถุ
ตัวอย่างแผนผังชั้นเรียน
คีย์ไดอะแกรมคลาส
- เค้ก กล่องบน มีชื่อคลาส
- เค้ก กล่องกลาง มีตัวแปรคลาส
- เค้ก กล่องล่าง มีวิธีการเรียน
- เค้ก ลบ (-) เครื่องหมายหมายถึง ขอบเขตส่วนตัว
- เค้ก บวก (+) เครื่องหมาย หมายถึง ขอบเขตสาธารณะ
- เค้ก แฮช (#) เครื่องหมาย หมายถึง ขอบเขตที่ได้รับการคุ้มครอง
วิธีสร้างคลาสใน PHP
คีย์เวิร์ด class ใช้เพื่อกำหนดคลาสใน PHP ด้านล่างนี้เป็นกฎสำหรับการสร้างคลาสใน PHP
- ชื่อชั้นเรียนควรขึ้นต้นด้วยตัวอักษร
- ชื่อคลาสไม่สามารถเป็นคำสงวน PHP
- ชื่อคลาสไม่สามารถมีช่องว่างได้
สมมติว่าเราต้องการสร้างคลาสสำหรับแสดงสัตว์
เราจะเริ่มต้นด้วยการระบุลักษณะทั่วไปของสัตว์ทุกชนิด
- สัตว์ทุกชนิดอยู่ในครอบครัว เช่น สัตว์กินพืช สัตว์กินพืช งานรื่นเริง ฯลฯ
- สัตว์ทุกตัวกินอาหาร
แผนภาพด้านล่างแสดงแผนภาพของสัตว์
ตอนนี้เรามาเขียนโค้ดคลาสสัตว์ของเรากันดีกว่า
<?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” หมายความว่าไม่สามารถเข้าถึงตัวแปรภายนอกคลาสได้โดยตรง (Encapsulation)
- “public function __construct($family…)” เป็นวิธีการสร้าง PHP ฟังก์ชันนี้จะถูกเรียกเมื่อใดก็ตามที่มีการสร้างอินสแตนซ์ของคลาส ในกรณีนี้ เรากำลังจัดครอบครัวและอาหาร
- “ส่วนสาธารณะรับ…()” เป็นวิธีการเข้าถึงคุณค่าของครอบครัวหรืออาหาร (Encapsulation)
- “ชุดฟังก์ชันสาธารณะ…()” เป็นวิธีการกำหนดมูลค่าตระกูลหรืออาหาร (Encapsulation)
วิธีใช้ Inheritance ใน PHP
เราจะทำงานร่วมกับวัวและสิงโต ทั้งวัวและสิงโตสืบทอดมาจากคลาสสัตว์
แผนภาพชั้นเรียนด้านล่างแสดงความสัมพันธ์
โปรดทราบว่าวัวสืบทอดมาจากประเภทสัตว์และกำหนดตัวแปรและวิธีการของตัวมันเองด้วย
ตอนนี้เรามาเขียนโค้ดคลาส 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); } } ?>
ที่นี่
- “คลาส…ขยาย Animal” ทำให้วัวและสิงโตใช้วิธีจากคลาส Animal (Inheritance)
วิธีสร้างวัตถุของชั้นเรียน
คลาส Animal, Cow และ Lion ควรอยู่ในไดเร็กทอรีเดียวกันเพื่อความเรียบง่าย
ตอนนี้เรามาสร้างแอปพลิเคชันที่ใช้คลาสของเรากันดีกว่า
ตัวอย่างคลาส PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Canirval', '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(); ?>
การทดสอบแอปพลิเคชันของเรา
ตอนนี้เรามาดูแอปพลิเคชันของเราในเว็บเบราว์เซอร์กันดีกว่า
ถูกต้องเลย! ตอนนี้เรามาดูหลักการที่สามของ OOP ซึ่งก็คือความหลากหลาย
สมมติว่าเราต้องการพัฒนาแอพพลิเคชั่นที่เชื่อมต่อกับเอ็นจิ้นฐานข้อมูลต่างๆ เช่น MySQL และ SQL เซิร์ฟเวอร์แต่ใช้อินเทอร์เฟซเครื่องแบบเดียวกัน
เราสามารถสร้างอินเทอร์เฟซที่กำหนดวิธีการมาตรฐานและคลาสนามธรรมที่ใช้วิธีการทั่วไป
- อินเตอร์เฟซ – มันคล้ายกับชั้นเรียน มันกำหนดวิธีการและพารามิเตอร์เท่านั้น
- คลาสนามธรรม – เป็นคลาสที่ไม่สามารถใช้สร้างวัตถุได้โดยตรง จุดประสงค์คือเพื่อให้มีการนำวิธีการทั่วไปไปใช้บางส่วนหรือทั้งหมด
แผนภาพคลาสด้านล่างแสดงความสัมพันธ์ระหว่างคลาสนามธรรม อินเทอร์เฟซ และคลาสการใช้งานของเรา
ตอนนี้เรามาสร้างคลาสนามธรรมของเรากันดีกว่า
<?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; } } ?>
ที่นี่
- “คลาสนามธรรม” หมายความว่าคลาสไม่สามารถใช้กับ php create object ได้โดยตรง
- “$host,$db…” เป็นตัวแปรคลาสทั่วไปในการใช้งานทั้งหมด
- “function __construct(…)” เป็นเมธอดตัวสร้างคลาส php ที่ตั้งค่าตัวแปรทั่วไปเมื่อเริ่มต้น
ตอนนี้เรามาสร้างอินเทอร์เฟซที่มีวิธีการมาตรฐานซึ่งจะนำไปใช้แตกต่างกันไปขึ้นอยู่กับกลไกฐานข้อมูล
<?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 MySQLไดร์เวอร์.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 } } ?>
ที่นี่
- “คลาส … ขยาย DBCommonMethods” ใช้วิธีการใน DBCommonMethods
- “… ใช้ DBInterface” ทำให้แน่ใจว่าคลาสจัดเตรียมวิธีการมาตรฐานโดยไม่คำนึงถึงไดรเวอร์ฐานข้อมูลที่ใช้
การใช้โค้ดด้านบน โค้ดที่ใช้คลาสด้านบนจะมีลักษณะเช่นนี้
<?php $db = new MySQLDriver($host,$db,$uid,$password); ?>
Or
<?php $db = new MSSQLServerDriver ($host,$db,$uid,$password); ?>
รหัสที่เหลือจะเหมือนกันสำหรับไดรเวอร์ทั้งสองเช่น;
<?php $db->db_connect(); $db->insert($data); ?>
สรุป
- การเขียนโปรแกรมเชิงวัตถุ OOP เป็นเทคนิคที่ทรงพลังที่สร้างแบบจำลองแอปพลิเคชันตามวัตถุในโลกแห่งความเป็นจริง
- คลาสคือการเป็นตัวแทนของวัตถุในโลกแห่งความเป็นจริงพร้อมคุณสมบัติและวิธีการ
- หลักการพื้นฐานสามประการของ OOP คือ
- encapsulation
- มรดก
- ความหลากหลาย