ใน Module นี้ เราจะมาเรียนรู้เกี่ยวกับแนวคิดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming – OOP) ใน PHP ซึ่งเป็นกระบวนทัศน์การเขียนโปรแกรมที่ช่วยให้โค้ดมีความเป็นระเบียบ นำกลับมาใช้ใหม่ได้ง่าย และง่ายต่อการบำรุงรักษาสำหรับโปรเจคขนาดใหญ่
OOP คืออะไร?
OOP เป็นกระบวนทัศน์การเขียนโปรแกรมที่เน้นการจัดระเบียบโค้ดโดยการสร้าง “วัตถุ” (Objects) ซึ่งเป็น Instance ของ “คลาส” (Classes) คลาสเปรียบเสมือนพิมพ์เขียวหรือแม่แบบสำหรับสร้างวัตถุ และวัตถุคือสิ่งมีชีวิตที่มีคุณสมบัติ (Properties หรือ Attributes) และพฤติกรรม (Methods หรือ Behaviors)
แนวคิดหลักของ OOP
OOP มีแนวคิดหลัก 4 ประการ:
1. การห่อหุ้ม (Encapsulation)
การห่อหุ้มคือการรวมข้อมูล (Properties) และฟังก์ชัน (Methods) ที่ทำงานกับข้อมูลนั้นๆ ไว้ด้วยกันภายในคลาส เพื่อซ่อนรายละเอียดภายในและควบคุมการเข้าถึงข้อมูลจากภายนอก
<?php
class Car {
public $model;
private $speed;
public function __construct($model) {
$this->model = $model;
$this->speed = 0;
}
public function accelerate($increment) {
$this->speed += $increment;
}
public function getSpeed() {
return $this->speed;
}
}
$myCar = new Car("Toyota");
$myCar->accelerate(20);
echo "รถรุ่น " . $myCar->model . " วิ่งด้วยความเร็ว " . $myCar->getSpeed() . " กม/ชม.";
// echo $myCar->speed; // Error: Cannot access private property
?>
2. การสืบทอด (Inheritance)
การสืบทอดคือกลไกที่คลาสหนึ่ง (Subclass หรือ Child Class) สามารถรับคุณสมบัติและพฤติกรรมทั้งหมดจากอีกคลาสหนึ่ง (Superclass หรือ Parent Class) ทำให้สามารถสร้างคลาสใหม่โดยต่อยอดจากคลาสที่มีอยู่ได้
<?php
class Vehicle {
protected $brand;
public function __construct($brand) {
$this->brand = $brand;
}
public function move() {
echo "ยานพาหนะกำลังเคลื่อนที่<br>";
}
}
class Bicycle extends Vehicle {
public function __construct($brand) {
parent::__construct($brand); // เรียก Constructor ของ Parent Class
}
public function pedal() {
echo "จักรยานกำลังปั่น<br>";
}
}
$myBicycle = new Bicycle("Giant");
$myBicycle->move(); // สืบทอด Method จาก Vehicle
$myBicycle->pedal();
?>
3. การพ้องรูป (Polymorphism)
การพ้องรูปหมายถึงความสามารถของวัตถุที่มีคลาสต่างกัน แต่มีการ Implement Interface หรือสืบทอดจากคลาสเดียวกัน สามารถตอบสนองต่อ Method ที่มีชื่อเดียวกันได้ในรูปแบบที่แตกต่างกัน
<?php
interface Animal {
public function makeSound();
}
class Dog implements Animal {
public function makeSound() {
echo "Woof!<br>";
}
}
class Cat implements Animal {
public function makeSound() {
echo "Meow!<br>";
}
}
function animalSound(Animal $animal) {
$animal->makeSound();
}
$dog = new Dog();
$cat = new Cat();
animalSound($dog); // Output: Woof!
animalSound($cat); // Output: Meow!
?>
4. การนามธรรม (Abstraction)
การนามธรรมคือการซ่อนรายละเอียดที่ซับซ้อนและแสดงเฉพาะข้อมูลหรือการทำงานที่จำเป็นต่อผู้ใช้ ทำให้ผู้ใช้สามารถ Focus ไปที่ “สิ่งที่” วัตถุทำได้ โดยไม่ต้องสนใจว่า “ทำอย่างไร” Abstract Classes และ Interfaces เป็นเครื่องมือสำคัญในการ实现 Abstraction
<?php
abstract class Shape {
abstract public function area();
}
class Circle extends Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * $this->radius * $this->radius;
}
}
$circle = new Circle(5);
echo "พื้นที่วงกลม: " . $circle->area();
?>
คลาสและวัตถุ (Classes and Objects)
การสร้างคลาส (Defining a Class)
ใช้ Keyword class
ตามด้วยชื่อคลาส และบล็อก {}
เพื่อกำหนด Properties และ Methods ของคลาส
<?php
class Person {
// Properties
public $name;
public $age;
// Method (Constructor)
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
// Method
public function greet() {
echo "สวัสดีครับ ผมชื่อ " . $this->name . " อายุ " . $this->age . " ปี<br>";
}
}
?>
การสร้างวัตถุ (Creating an Object)
ใช้ Keyword new
ตามด้วยชื่อคลาสและวงเล็บ ()
เพื่อสร้าง Instance ของคลาส (วัตถุ)
<?php
$person1 = new Person("สมชาย", 30);
$person2 = new Person("สมหญิง", 25);
$person1->greet(); // Output: สวัสดีครับ ผมชื่อ สมชาย อายุ 30 ปี
$person2->greet(); // Output: สวัสดีครับ ผมชื่อ สมหญิง อายุ 25 ปี
?>
Properties และ Methods
- Properties (คุณสมบัติ): คือตัวแปรที่อยู่ภายในคลาส ใช้เพื่อเก็บข้อมูลของวัตถุ
- Methods (พฤติกรรม): คือฟังก์ชันที่อยู่ภายในคลาส ใช้เพื่อกำหนดการทำงานของวัตถุ
Visibility (การเข้าถึง)
PHP มี Keywords ที่ใช้กำหนดระดับการเข้าถึง Properties และ Methods:
public
: สามารถเข้าถึงได้จากทุกที่ (ภายในคลาส, ภายนอกคลาส, คลาสลูก)protected
: สามารถเข้าถึงได้จากภายในคลาสและคลาสลูกprivate
: สามารถเข้าถึงได้เฉพาะจากภายในคลาสเท่านั้น
Constructor และ Destructor
- Constructor (
__construct()
): เป็น Method พิเศษที่จะถูกเรียกใช้โดยอัตโนมัติเมื่อมีการสร้างวัตถุใหม่ มักใช้สำหรับการกำหนดค่าเริ่มต้นให้กับ Properties ของวัตถุ - Destructor (
__destruct()
): เป็น Method พิเศษที่จะถูกเรียกใช้เมื่อไม่มี References ใดๆ ชี้มายังวัตถุนั้นๆ อีกต่อไป มักใช้สำหรับการจัดการทรัพยากรที่วัตถุใช้งานอยู่ (เช่น ปิด Connection ฐานข้อมูล)
<?php
class MyClass {
public function __construct() {
echo "Object created<br>";
}
public function __destruct() {
echo "Object destroyed<br>";
}
}
$obj = new MyClass(); // Output: Object created
unset($obj); // Output: Object destroyed
?>
กิจกรรมใน Module 11
- สร้างคลาสพื้นฐานที่มี Properties และ Methods
- สร้างวัตถุจากคลาสที่คุณสร้างและเรียกใช้งาน Properties และ Methods
- ทดลองใช้ Constructor ในการกำหนดค่าเริ่มต้นให้กับวัตถุ
- สร้างคลาสที่มีการสืบทอดจากคลาสอื่น และทดลองใช้งาน Properties และ Methods ที่สืบทอดมา
- (Optional) ลองสร้าง Interface และ Implement ในคลาสต่างๆ
- (Optional) ศึกษาเพิ่มเติมเกี่ยวกับ Abstract Classes และการใช้งาน
ใน Module ถัดไป เราจะลงลึกในเรื่องของ OOP มากขึ้น โดยจะศึกษาเกี่ยวกับ Namespaces, Autoloading, และ Concepts ที่สำคัญอื่นๆ ครับ!