PHP101 – การเขียนโปรแกรมเชิงวัตถุเบื้องต้น (Object-Oriented Programming – OOP)

ใน Module นี้ เราจะมาเรียนรู้เกี่ยวกับแนวคิดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming – OOP) ใน PHP ซึ่งเป็นกระบวนทัศน์การเขียนโปรแกรมที่ช่วยให้โค้ดมีความเป็นระเบียบ นำกลับมาใช้ใหม่ได้ง่าย และง่ายต่อการบำรุงรักษาสำหรับโปรเจคขนาดใหญ่

OOP คืออะไร?

OOP เป็นกระบวนทัศน์การเขียนโปรแกรมที่เน้นการจัดระเบียบโค้ดโดยการสร้าง “วัตถุ” (Objects) ซึ่งเป็น Instance ของ “คลาส” (Classes) คลาสเปรียบเสมือนพิมพ์เขียวหรือแม่แบบสำหรับสร้างวัตถุ และวัตถุคือสิ่งมีชีวิตที่มีคุณสมบัติ (Properties หรือ Attributes) และพฤติกรรม (Methods หรือ Behaviors)

แนวคิดหลักของ OOP

OOP มีแนวคิดหลัก 4 ประการ:

1. การห่อหุ้ม (Encapsulation)

การห่อหุ้มคือการรวมข้อมูล (Properties) และฟังก์ชัน (Methods) ที่ทำงานกับข้อมูลนั้นๆ ไว้ด้วยกันภายในคลาส เพื่อซ่อนรายละเอียดภายในและควบคุมการเข้าถึงข้อมูลจากภายนอก

PHP
<?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
<?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
<?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
<?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
<?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
<?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
<?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

  1. สร้างคลาสพื้นฐานที่มี Properties และ Methods
  2. สร้างวัตถุจากคลาสที่คุณสร้างและเรียกใช้งาน Properties และ Methods
  3. ทดลองใช้ Constructor ในการกำหนดค่าเริ่มต้นให้กับวัตถุ
  4. สร้างคลาสที่มีการสืบทอดจากคลาสอื่น และทดลองใช้งาน Properties และ Methods ที่สืบทอดมา
  5. (Optional) ลองสร้าง Interface และ Implement ในคลาสต่างๆ
  6. (Optional) ศึกษาเพิ่มเติมเกี่ยวกับ Abstract Classes และการใช้งาน

ใน Module ถัดไป เราจะลงลึกในเรื่องของ OOP มากขึ้น โดยจะศึกษาเกี่ยวกับ Namespaces, Autoloading, และ Concepts ที่สำคัญอื่นๆ ครับ!

ความคิดเห็น