แนวคิดการเขียนโปรแกรมเชิงวัตถุ (OOP) ในภาษา PHP พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🧱 คลาสและอ็อบเจ็กต์: คลาสกำหนดคุณสมบัติและเมธอดของสิ่งต่างๆ ในโลกแห่งความเป็นจริง และอ็อบเจ็กต์คืออินสแตนซ์เดียวของคลาสนั้น
  • 🔒 encapsulation: ตัวแปรส่วนตัวที่มีเมธอด get และ set แบบสาธารณะจะซ่อนรายละเอียดภายในและปกป้องสถานะของวัตถุ
  • 👪 มรดก: คีย์เวิร์ด extends ช่วยให้คลาสลูกสามารถนำเมธอดของคลาสแม่มาใช้ซ้ำได้ ซึ่งช่วยลดการเขียนโค้ดที่ซ้ำซ้อน
  • 🔁 ความหลากหลาย: อินเทอร์เฟซกำหนดเมธอดมาตรฐานที่คลาสต่างๆ นำไปใช้ในรูปแบบที่แตกต่างกัน โดยอยู่ภายใต้การควบคุมที่เป็นเอกภาพเดียวกันtract.
  • 📐 แผนภาพคลาส UML: แผนภาพคลาสแสดงชื่อคลาส ตัวแปร และเมธอด โดยใช้เครื่องหมายบวก ลบ และแฮช เพื่อระบุขอบเขตสาธารณะ ส่วนตัว และป้องกัน ตามลำดับ
  • 🧩 อินเทอร์เฟซและ ABStract: กล้ามท้องtracคลาส t ใช้โค้ดร่วมกัน ในขณะที่อินเทอร์เฟซรับประกันว่าคลาสไดรเวอร์แต่ละคลาสจะมีเมธอดเดียวกัน
  • 🤖 AI ช่วยเหลือ: เครื่องมือ AI สามารถสร้างคลาส PHP จากคำอธิบาย และปรับปรุงโค้ดแบบขั้นตอนให้เป็นโค้ดเชิงวัตถุที่สะอาดตาได้

การเขียนโปรแกรมเชิงวัตถุด้วย 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

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

OOP Concepts ใน PHP

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

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

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

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

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

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

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

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

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

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

อ็อบเจ็กต์ทั้งสองใช้เมธอด get_family และ get_food ที่สืบทอดมาจากคลาส Animal ซึ่งแสดงให้เห็นถึงการสืบทอดคุณสมบัติ

วิธีนำ Polymorphism มาใช้ใน PHP

สมมติว่าเราต้องการพัฒนาแอปพลิเคชันที่เชื่อมต่อกับระบบฐานข้อมูลต่างๆ เช่น MySQL และ SQL เซิร์ฟเวอร์แต่ใช้ส่วนต่อประสานแบบเดียวกัน เราสามารถสร้างส่วนต่อประสานที่กำหนดวิธีการมาตรฐานและค่าสัมบูรณ์ได้tracคลาส t ที่ใช้งานเมธอดทั่วไป

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

แผนภาพคลาสที่แสดงด้านล่างแสดงให้เห็นถึงความสัมพันธ์ระหว่างตัวแปร abs ของเราtracคลาส t, อินเทอร์เฟซ และคลาสการใช้งาน

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

มาเริ่มสร้างกล้ามหน้าท้องกันเถอะ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);
?>

นี่คือตัวอย่างของโพลีมอร์ฟิซึม: การเรียกใช้เมธอดแบบเดียวกันจะใช้ได้กับไดรเวอร์ใดๆ ก็ตามที่ใช้งานอินเทอร์เฟซนั้น ดังนั้นโค้ดโดยรอบจึงไม่เปลี่ยนแปลงเมื่อคุณเปลี่ยนไปใช้เอนจินฐานข้อมูลอื่น

คำถามที่พบบ่อย

กล้ามท้องtracคลาสสามารถเก็บได้ทั้งเมธอดที่ถูกนำไปใช้งานและคุณสมบัติ และคลาสจะสืบทอดจากคลาสเดียวเท่านั้น อินเทอร์เฟซจะประกาศเฉพาะลายเซ็นของเมธอด และคลาสสามารถนำไปใช้งานเมธอดได้หลายแบบ ใช้ค่าสัมบูรณ์tracคลาส t สำหรับแชร์โค้ด อินเทอร์เฟซสำหรับบังคับใช้ contract.

เสาหลักทั้งสี่ ได้แก่ การห่อหุ้ม การสืบทอด ความหลากหลายทางรูปแบบ และการผกผันtraction. บทช่วยสอนนี้เน้นที่สามข้อแรก; abstraction ซ่อนรายละเอียดที่ซับซ้อนไว้เบื้องหลังอินเทอร์เฟซที่เรียบง่าย ซึ่ง PHP รองรับด้วย abstracคลาสและอินเทอร์เฟซ

สมาชิกสาธารณะสามารถเข้าถึงได้จากทุกที่ สมาชิกส่วนตัวเข้าถึงได้เฉพาะภายในคลาสเดียวกัน และสมาชิกที่ได้รับการป้องกันเข้าถึงได้เฉพาะภายในคลาสและคลาสย่อยเท่านั้น พวกมันบังคับใช้หลักการห่อหุ้มข้อมูลโดยการควบคุมว่าใครสามารถอ่านหรือเปลี่ยนแปลงคุณสมบัติหรือเมธอดแต่ละรายการได้

ใช่แล้ว เพียงแค่ป้อนฟิลด์หรือคำจำกัดความของตารางให้กับ AI มันก็สามารถสร้างคลาสที่มีคุณสมบัติแบบระบุประเภท ตัวสร้าง และเมธอด get และ set ได้ Revตรวจสอบประเภทข้อมูลและเพิ่มการตรวจสอบความถูกต้องก่อนใช้งานคลาส

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

สรุปโพสต์นี้ด้วย: