メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

Inheritance ใน PHP: การสืบทอดคุณสมบัติ

บทความนี้แนะนำแนวคิดเรื่อง Inheritance ใน PHP ซึ่งเป็นกลไกที่ช่วยให้ Class ใหม่ (Child Class) สามารถสืบทอดคุณสมบัติและ Methods จาก Class ที่มีอยู่แล้ว (Parent C...

Inheritance ใน PHP: การสืบทอดคุณสมบัติ

ในบทที่แล้ว เราได้เรียนรู้พื้นฐาน Object-Oriented Programming (OOP) ใน PHP รวมถึงการสร้าง Class, Object, Properties, Methods และ Constructor ในบทนี้ เราจะมาเจาะลึกเรื่อง Inheritance หรือการสืบทอดคุณสมบัติ ซึ่งเป็นหนึ่งในแนวคิดหลักที่สำคัญของ OOP

Inheritance คือกลไกที่ช่วยให้ Class ใหม่ (Child Class หรือ Subclass) สามารถรับช่วง (Inherit) Properties และ Methods จาก Class ที่มีอยู่แล้ว (Parent Class หรือ Superclass) ทำให้เราสามารถนำโค้ดเดิมกลับมาใช้ใหม่ได้ ลดความซ้ำซ้อน และสร้างความสัมพันธ์แบบ "is-a" ระหว่าง Class ต่างๆ

Extends Keyword: จุดเริ่มต้นของการสืบทอด

ใน PHP เราใช้ Keyword extends เพื่อระบุว่า Class หนึ่งสืบทอดมาจาก Class อื่น รูปแบบการใช้งานเป็นดังนี้:

class ChildClass extends ParentClass {
    // ...
}

ตัวอย่าง: ลองจินตนาการว่าเรามี Class ชื่อ Animal ซึ่งเป็น Class ต้นแบบสำหรับสัตว์ต่างๆ

class Animal {
    public $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function makeSound() {
        echo "Generic animal sound!\n";
    }
}

ตอนนี้ เราต้องการสร้าง Class สำหรับสุนัข (Dog) ซึ่งเป็นสัตว์ชนิดหนึ่ง เราสามารถใช้ Inheritance เพื่อให้ Dog สืบทอดคุณสมบัติจาก Animal ได้ดังนี้:

class Dog extends Animal {
    public function makeSound() {
        echo "Woof!\n";
    }
}

$myDog = new Dog("Buddy");
echo $myDog->name . "\n"; // Output: Buddy
$myDog->makeSound(); // Output: Woof!

จากตัวอย่างข้างต้น Dog สืบทอด Property $name และ Method makeSound() จาก Animal โดยที่เราไม่ต้องเขียนโค้ดเหล่านี้ซ้ำใน Dog เลย

Parent Class และ Child Class: ความสัมพันธ์ที่ต้องเข้าใจ

  • Parent Class (Superclass): คือ Class ที่ Class อื่นสืบทอดคุณสมบัติไปให้ ในตัวอย่างข้างต้น Animal คือ Parent Class
  • Child Class (Subclass): คือ Class ที่สืบทอดคุณสมบัติมาจาก Class อื่น ในตัวอย่างข้างต้น Dog คือ Child Class

Child Class สามารถเข้าถึง public และ protected Properties และ Methods ของ Parent Class ได้ แต่จะไม่สามารถเข้าถึง private Properties และ Methods ได้

ข้อควรจำ: PHP ไม่รองรับ Multiple Inheritance นั่นคือ Class หนึ่งไม่สามารถสืบทอดมาจากหลาย Class ได้

Overriding Methods: การปรับเปลี่ยนพฤติกรรม

ในตัวอย่างก่อนหน้า เราได้ทำการ Overriding Method makeSound() ใน Class Dog การ Overriding คือการที่ Child Class สร้าง Method ที่มีชื่อเหมือนกับ Method ใน Parent Class เพื่อปรับเปลี่ยนพฤติกรรมของ Method นั้นให้เหมาะสมกับ Child Class

ตัวอย่าง: สมมติว่าเราต้องการให้ Dog มี Method เพิ่มเติมชื่อ fetch() ที่ใช้สำหรับเล่นคาบลูกบอล

class Dog extends Animal {
    public function makeSound() {
        echo "Woof!\n";
    }

    public function fetch() {
        echo "Fetching the ball!\n";
    }
}

$myDog = new Dog("Buddy");
$myDog->fetch(); // Output: Fetching the ball!

ในขณะเดียวกัน เรายังสามารถเรียกใช้ Method ของ Parent Class ได้จากภายใน Child Class โดยใช้ Keyword parent::

class Dog extends Animal {
    public function makeSound() {
        echo "Woof!\n";
        parent::makeSound(); // เรียก makeSound() ของ Animal
    }
}

$myDog = new Dog("Buddy");
$myDog->makeSound();
// Output:
// Woof!
// Generic animal sound!

การใช้ parent:: ช่วยให้เราสามารถเพิ่มพฤติกรรมใหม่ให้กับ Method โดยยังคงรักษาพฤติกรรมเดิมของ Parent Class ไว้ได้

กรณีใช้งานจริง: ระบบจัดการผู้ใช้งาน

ลองพิจารณาสถานการณ์ที่เรากำลังสร้างระบบจัดการผู้ใช้งาน เราสามารถสร้าง Class User เป็น Parent Class และสร้าง Child Class สำหรับผู้ใช้งานประเภทต่างๆ เช่น Admin, Editor, และ Subscriber

class User {
    public $username;
    public $email;

    public function __construct($username, $email) {
        $this->username = $username;
        $this->email = $email;
    }

    public function login() {
        echo "User logged in.\n";
    }

    public function logout() {
        echo "User logged out.\n";
    }
}

class Admin extends User {
    public function login() {
        echo "Admin logged in with special privileges.\n";
    }

    public function manageUsers() {
        echo "Admin is managing users.\n";
    }
}

$adminUser = new Admin("admin", "admin@example.com");
$adminUser->login(); // Output: Admin logged in with special privileges.
$adminUser->manageUsers(); // Output: Admin is managing users.

ในตัวอย่างนี้ Admin สืบทอด Properties $username และ $email รวมถึง Methods login() และ logout() จาก User และยังมีการ Overriding Method login() เพื่อให้ Admin มีสิทธิ์พิเศษในการเข้าสู่ระบบ นอกจากนี้ยังมี Method manageUsers() ที่มีเฉพาะใน Admin เท่านั้น

ข้อผิดพลาดที่พบบ่อย

  • ลืม Keyword extends: หากไม่ใส่ extends Class ใหม่จะไม่สืบทอดคุณสมบัติใดๆ จาก Class อื่น
  • พยายามเข้าถึง private Members: Child Class ไม่สามารถเข้าถึง private Properties และ Methods ของ Parent Class ได้
  • ชื่อ Method ซ้ำกันโดยไม่ได้ตั้งใจ: หาก Child Class มี Method ที่มีชื่อเหมือนกับ Method ใน Parent Class โดยไม่ได้ตั้งใจ อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด
  • การเรียก parent:: ผิดที่: ตรวจสอบให้แน่ใจว่าคุณเรียก parent:: ใน Method ที่ถูกต้อง และในสถานการณ์ที่เหมาะสม

สรุป

Inheritance เป็นเครื่องมือที่มีประสิทธิภาพในการสร้างโค้ดที่สามารถนำกลับมาใช้ใหม่ได้ ลดความซ้ำซ้อน และสร้างความสัมพันธ์ที่ชัดเจนระหว่าง Class ต่างๆ การเข้าใจหลักการของ Inheritance จะช่วยให้คุณสามารถออกแบบระบบ Object-Oriented ที่มีความยืดหยุ่นและบำรุงรักษาได้ง่ายยิ่งขึ้น ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ Polymorphism ซึ่งเป็นอีกหนึ่งแนวคิดหลักที่สำคัญของ OOP ที่เกี่ยวข้องกับการใช้งาน Interfaces และ Abstract Classes

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る