บทช่วยสอนแนวคิดการเขียนโปรแกรมเชิงวัตถุ PHP (OOPs) พร้อมตัวอย่าง

OOP คืออะไร?

Object Oriented เป็นแนวทางในการพัฒนาซอฟต์แวร์ที่สร้างแบบจำลองแอปพลิเคชันรอบๆ วัตถุในโลกแห่งความเป็นจริง เช่น พนักงาน รถยนต์ บัญชีธนาคาร ฯลฯ คลาสจะกำหนดคุณสมบัติและวิธีการของวัตถุในโลกแห่งความเป็นจริง วัตถุเป็นการเกิดขึ้นของคลาส

องค์ประกอบพื้นฐานสามประการของการวางแนววัตถุ ได้แก่

  • การวิเคราะห์เชิงวัตถุ – การทำงานของระบบ
  • การออกแบบเชิงวัตถุ – สถาปัตยกรรมของระบบ
  • การเขียนโปรแกรมเชิงวัตถุ – การนำแอปพลิเคชันไปใช้

หลักการเขียนโปรแกรมเชิงวัตถุ

หลักการสำคัญสามประการของ OOP คือ

  • encapsulation – เกี่ยวข้องกับการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะวิธีการเท่านั้น วัตถุประสงค์หลักของการห่อหุ้มคือเพื่อ:
  • ลดความซับซ้อนในการพัฒนาซอฟต์แวร์ – การใช้คลาสกลายเป็นเรื่องง่าย โดยการซ่อนรายละเอียดการใช้งานและเปิดเผยเฉพาะการดำเนินการ
  • ปกป้องสถานะภายในของออบเจ็กต์ - การเข้าถึงตัวแปรคลาสทำได้ผ่านวิธีการต่างๆ เช่น รับและตั้งค่า ซึ่งทำให้คลาสมีความยืดหยุ่นและบำรุงรักษาง่าย
  • การใช้งานภายในของคลาสสามารถเปลี่ยนแปลงได้โดยไม่ต้องกังวลกับการทำลายโค้ดที่ใช้คลาส
  • มรดก – เกี่ยวข้องกับความสัมพันธ์ระหว่างชั้นเรียน ความสัมพันธ์อยู่ในรูปแบบของพ่อแม่และลูก เด็กใช้วิธีการที่กำหนดไว้ในชั้นเรียนผู้ปกครอง วัตถุประสงค์หลักของการรับมรดกคือ
  • การนำกลับมาใช้ใหม่- รายการย่อยจำนวนหนึ่งสามารถสืบทอดมาจากผู้ปกครองคนเดียวกันได้ สิ่งนี้มีประโยชน์มากเมื่อเราต้องมีฟังก์ชันทั่วไป เช่น การเพิ่ม การอัปเดต และการลบข้อมูลจากฐานข้อมูล
  • ความหลากหลาย – สิ่งนี้เกี่ยวข้องกับการมีรูปแบบเดียว แต่มีวิธีการนำไปใช้ที่แตกต่างกันมากมาย วัตถุประสงค์หลักของความหลากหลายคือ
  • ลดความซับซ้อนในการบำรุงรักษาแอปพลิเคชันและทำให้ขยายได้มากขึ้น

OOP Concepts ใน PHP

PHP เป็นภาษาสคริปต์เชิงวัตถุ มันสนับสนุนหลักการข้างต้นทั้งหมด หลักการข้างต้นสามารถทำได้โดย;

  • encapsulation – ผ่านการใช้วิธีการ “get” และ “set” เป็นต้น
  • มรดก – ผ่านการใช้คำสำคัญขยาย
  • ความหลากหลาย – ผ่านการใช้คำสำคัญ Implements

ตอนนี้เรามีความรู้พื้นฐานเกี่ยวกับ OOP และวิธีการรองรับแล้ว PHPให้เราดูตัวอย่างที่ใช้หลักการข้างต้น

UML คืออะไร?

Unified Modeling Language UML เป็นเทคนิคที่ใช้ในการออกแบบและจัดทำเอกสารระบบเชิงวัตถุ

UML สร้างเอกสารจำนวนหนึ่ง แต่เราจะดูที่แผนภาพคลาสซึ่งมีความสำคัญมากต่อการเขียนโปรแกรม PHP เชิงวัตถุ

ตัวอย่างแผนผังชั้นเรียน

OOP Concepts ใน PHP

คีย์ไดอะแกรมคลาส

  • เค้ก กล่องบน มีชื่อคลาส
  • เค้ก กล่องกลาง มีตัวแปรคลาส
  • เค้ก กล่องล่าง มีวิธีการเรียน
  • เค้ก ลบ (-) เครื่องหมายหมายถึง ขอบเขตส่วนตัว
  • เค้ก บวก (+) เครื่องหมาย หมายถึง ขอบเขตสาธารณะ
  • เค้ก แฮช (#) เครื่องหมาย หมายถึง ขอบเขตที่ได้รับการคุ้มครอง

วิธีสร้างคลาสใน PHP

คีย์เวิร์ด class ใช้เพื่อกำหนดคลาสใน PHP ด้านล่างนี้เป็นกฎสำหรับการสร้างคลาสใน 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

เราจะทำงานร่วมกับวัวและสิงโต ทั้งวัวและสิงโตสืบทอดมาจากคลาสสัตว์

แผนภาพชั้นเรียนด้านล่างแสดงความสัมพันธ์

ใช้ 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();
?>

การทดสอบแอปพลิเคชันของเรา

ตอนนี้เรามาดูแอปพลิเคชันของเราในเว็บเบราว์เซอร์กันดีกว่า

การสืบทอดใน PHP

ถูกต้องเลย! ตอนนี้เรามาดูหลักการที่สามของ OOP ซึ่งก็คือความหลากหลาย

สมมติว่าเราต้องการพัฒนาแอพพลิเคชั่นที่เชื่อมต่อกับเอ็นจิ้นฐานข้อมูลต่างๆ เช่น MySQL และ SQL เซิร์ฟเวอร์แต่ใช้อินเทอร์เฟซเครื่องแบบเดียวกัน

เราสามารถสร้างอินเทอร์เฟซที่กำหนดวิธีการมาตรฐานและคลาสนามธรรมที่ใช้วิธีการทั่วไป

  • อินเตอร์เฟซ – มันคล้ายกับชั้นเรียน มันกำหนดวิธีการและพารามิเตอร์เท่านั้น
  • คลาสนามธรรม – เป็นคลาสที่ไม่สามารถใช้สร้างวัตถุได้โดยตรง จุดประสงค์คือเพื่อให้มีการนำวิธีการทั่วไปไปใช้บางส่วนหรือทั้งหมด

แผนภาพคลาสด้านล่างแสดงความสัมพันธ์ระหว่างคลาสนามธรรม อินเทอร์เฟซ และคลาสการใช้งานของเรา

การสืบทอดใน PHP

ตอนนี้เรามาสร้างคลาสนามธรรมของเรากันดีกว่า

<?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
  • มรดก
  • ความหลากหลาย