Object-Oriented Programming (OOP): Classes and Objects
ในบทเรียนก่อนหน้า เราได้เรียนรู้เกี่ยวกับการ Autoloading Classes ซึ่งเป็นส่วนหนึ่งของการจัดการโค้ดให้เป็นระเบียบและง่ายต่อการบำรุงรักษา ในบทนี้ เราจะเข้าสู่หัวใจสำคัญของการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming หรือ OOP) นั่นคือ Classes และ Objects ซึ่งเป็นพื้นฐานสำคัญในการสร้างโปรแกรมที่มีโครงสร้างและจัดการได้ง่ายยิ่งขึ้น
ทำไมต้อง OOP?
ก่อนที่เราจะลงมือเขียนโค้ด เรามาทำความเข้าใจกันก่อนว่าทำไม OOP ถึงมีความสำคัญในการพัฒนาซอฟต์แวร์ขนาดใหญ่:
- การจัดระเบียบโค้ด: OOP ช่วยให้เราสามารถจัดระเบียบโค้ดให้เป็นกลุ่มของ objects ที่ทำงานร่วมกัน ทำให้โค้ดอ่านง่ายและบำรุงรักษาได้ง่ายขึ้น
- การนำโค้ดกลับมาใช้ใหม่ (Reusability): OOP สนับสนุนการสร้าง components ที่สามารถนำกลับมาใช้ใหม่ได้ในหลายส่วนของโปรแกรม หรือแม้แต่ในโปรเจ็กต์อื่นๆ
- การซ่อนรายละเอียด (Encapsulation): OOP ช่วยให้เราสามารถซ่อนรายละเอียดการทำงานภายในของ object ได้ ทำให้ผู้ใช้ object ไม่จำเป็นต้องรู้ว่า object ทำงานอย่างไร เพียงแค่รู้ว่าจะใช้งานอย่างไร
- การขยายขีดความสามารถ (Extensibility): OOP ช่วยให้เราสามารถขยายขีดความสามารถของโปรแกรมได้ง่าย โดยการสร้าง objects ใหม่ที่สืบทอดคุณสมบัติจาก objects เดิม
การใช้ OOP ไม่ได้หมายความว่าโปรแกรมของคุณจะ "ดี" ขึ้นโดยอัตโนมัติ การออกแบบ OOP ที่ดีต้องอาศัยความเข้าใจในหลักการและแนวคิดต่างๆ รวมถึงการตัดสินใจเลือกแนวทางที่เหมาะสมกับปัญหาที่ต้องการแก้ไข
Classes: พิมพ์เขียวของ Objects
Class คือพิมพ์เขียว (blueprint) หรือแม่แบบที่ใช้อธิบายลักษณะและพฤติกรรมของ object ชนิดหนึ่ง เปรียบเสมือนแบบแปลนบ้านที่อธิบายรายละเอียดของบ้าน เช่น จำนวนห้อง ขนาดของห้อง วัสดุที่ใช้ ฯลฯ
ใน PHP เราสามารถสร้าง class ได้โดยใช้ keyword `class` ตามด้วยชื่อ class และปีกกา `{}` ที่ครอบคลุมส่วนประกอบต่างๆ ของ class
<?php
class Dog {
// Properties (คุณสมบัติ)
public $name;
public $breed;
public $age;
// Methods (พฤติกรรม)
public function bark() {
echo "Woof!";
}
public function getAgeInHumanYears() {
return $this->age * 7;
}
}
?>
ในตัวอย่างข้างต้น เราได้สร้าง class ชื่อ `Dog` ซึ่งมี:
- Properties: `$name`, `$breed`, และ `$age` เป็นตัวแปรที่เก็บข้อมูลเกี่ยวกับสุนัขแต่ละตัว
- Methods: `bark()` และ `getAgeInHumanYears()` เป็นฟังก์ชันที่กำหนดพฤติกรรมของสุนัข
Visibility (การเข้าถึง)
คำว่า `public` ที่อยู่หน้า properties และ methods เป็นตัวกำหนดระดับการเข้าถึง (visibility) ซึ่งมี 3 ระดับ:
- `public`: สามารถเข้าถึงได้จากทุกที่ ทั้งภายในและภายนอก class
- `protected`: สามารถเข้าถึงได้จากภายใน class และจาก class ที่สืบทอด (inheritance) เท่านั้น
- `private`: สามารถเข้าถึงได้จากภายใน class เท่านั้น
การกำหนด visibility ช่วยให้เราสามารถควบคุมการเข้าถึงข้อมูลและพฤติกรรมของ object ได้ เพื่อป้องกันการแก้ไขข้อมูลโดยไม่ตั้งใจ หรือการใช้งาน methods ที่ไม่ควรถูกเรียกจากภายนอก
Objects: สำเนาที่สร้างจาก Class
Object คือสำเนา (instance) ที่สร้างขึ้นจาก class เปรียบเสมือนบ้านที่สร้างขึ้นตามแบบแปลน `Dog` class เป็นเพียงพิมพ์เขียว แต่ object คือสุนัขจริงๆ ที่มีชื่อ พันธุ์ และอายุ
เราสามารถสร้าง object ได้โดยใช้ keyword `new` ตามด้วยชื่อ class:
<?php
$myDog = new Dog();
?>
ในตัวอย่างนี้ เราได้สร้าง object ชื่อ `$myDog` จาก class `Dog` ตอนนี้ `$myDog` เป็นตัวแทนของสุนัขตัวหนึ่งที่เราสามารถกำหนดคุณสมบัติและเรียกใช้พฤติกรรมต่างๆ ได้
การเข้าถึง Properties และ Methods
เราสามารถเข้าถึง properties และ methods ของ object ได้โดยใช้ operator `->`:
<?php
$myDog = new Dog();
$myDog->name = "Buddy";
$myDog->breed = "Golden Retriever";
$myDog->age = 3;
echo "My dog's name is " . $myDog->name . ".\n";
echo "He is a " . $myDog->breed . ".\n";
echo "He is " . $myDog->age . " years old.\n";
echo "He is " . $myDog->getAgeInHumanYears() . " years old in human years.\n";
$myDog->bark(); // Outputs: Woof!
?>
ในตัวอย่างนี้ เราได้:
- กำหนดค่าให้กับ properties `$name`, `$breed`, และ `$age` ของ `$myDog` object
- เรียกใช้ method `getAgeInHumanYears()` เพื่อคำนวณอายุของสุนัขในหน่วยปีมนุษย์
- เรียกใช้ method `bark()` เพื่อให้สุนัขเห่า
ข้อควรจำและแนวปฏิบัติที่ดี
- ตั้งชื่อ Class ให้สื่อความหมาย: ชื่อ class ควรสื่อถึงสิ่งที่ class นั้นเป็นตัวแทน เช่น `Dog`, `Car`, `User`
- กำหนด Visibility ให้เหมาะสม: กำหนด visibility เพื่อควบคุมการเข้าถึงข้อมูลและพฤติกรรมของ object
- ใช้ Properties อย่างระมัดระวัง: หลีกเลี่ยงการใช้ properties ที่มีข้อมูลซ้ำซ้อน หรือสามารถคำนวณได้จาก properties อื่นๆ
- ใช้ Methods เพื่อจัดการพฤติกรรม: กำหนดพฤติกรรมของ object ผ่าน methods แทนที่จะแก้ไข properties โดยตรง
- คิดถึงการ Reusability: ออกแบบ class ให้สามารถนำกลับมาใช้ใหม่ได้ในหลายส่วนของโปรแกรม
สรุป
ในบทนี้ เราได้เรียนรู้เกี่ยวกับ Classes และ Objects ซึ่งเป็นพื้นฐานสำคัญของการเขียนโปรแกรมเชิงวัตถุ (OOP) เราได้เรียนรู้ว่า:
- Class คือพิมพ์เขียวที่ใช้อธิบายลักษณะและพฤติกรรมของ object
- Object คือสำเนาที่สร้างขึ้นจาก class
- เราสามารถเข้าถึง properties และ methods ของ object ได้โดยใช้ operator `->`
- การกำหนด visibility ช่วยให้เราสามารถควบคุมการเข้าถึงข้อมูลและพฤติกรรมของ object ได้
ในบทเรียนถัดไป เราจะลงลึกในรายละเอียดเกี่ยวกับ Properties และ Methods มากยิ่งขึ้น รวมถึงเรียนรู้เกี่ยวกับ Constructor และ Destructor ซึ่งเป็น methods พิเศษที่ใช้ในการเริ่มต้นและสิ้นสุดการทำงานของ object