ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

Getter และ Setter Methods: การควบคุมการเข้าถึง Properties

Getter และ Setter Methods: การควบคุมการเข้าถึง Properties

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ Access Modifiers (`public`, `protected`, และ `private`) ซึ่งเป็นเครื่องมือสำคัญในการควบคุมการเข้าถึง Properties และ Methods ของ Class แต่บางครั้งเราต้องการควบคุมการเข้าถึง Properties ให้ละเอียดกว่านั้น เช่น อนุญาตให้อ่านค่าได้ แต่ไม่อนุญาตให้แก้ไขโดยตรง หรือต้องการตรวจสอบความถูกต้องของข้อมูลก่อนที่จะทำการเปลี่ยนแปลงค่าของ Property นั่นคือเหตุผลที่เราใช้ Getter และ Setter Methods

ความหมายของ Getter และ Setter

  • Getter (ตัวดึงข้อมูล): เป็น Method ที่ใช้สำหรับอ่านค่าของ Property หนึ่งๆ โดยปกติ Getter จะมีชื่อขึ้นต้นด้วย `get` ตามด้วยชื่อ Property เช่น `getName()` สำหรับ Property ชื่อ `$name`
  • Setter (ตัวกำหนดค่า): เป็น Method ที่ใช้สำหรับกำหนดค่าให้กับ Property หนึ่งๆ โดยปกติ Setter จะมีชื่อขึ้นต้นด้วย `set` ตามด้วยชื่อ Property เช่น `setName()` สำหรับ Property ชื่อ `$name`

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

การสร้าง Getter และ Setter Methods

ลองมาดูตัวอย่างการสร้าง Class ที่มี Property ชื่อ `$name` และมี Getter และ Setter Methods สำหรับ Property นั้น:

<?php

class Person {
    private $name;

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

    // Getter Method สำหรับ $name
    public function getName() {
        return $this->name;
    }

    // Setter Method สำหรับ $name
    public function setName($name) {
        // ตรวจสอบความถูกต้องของข้อมูลก่อนกำหนดค่า
        if (is_string($name) && strlen($name) > 0) {
            $this->name = $name;
        } else {
            echo "Error: Invalid name. Name must be a non-empty string.\n";
        }
    }
}

$person = new Person("John Doe");

// อ่านค่า $name ผ่าน Getter
echo "Name: " . $person->getName() . "\n"; // Output: Name: John Doe

// กำหนดค่า $name ผ่าน Setter
$person->setName("Jane Smith");

// อ่านค่า $name อีกครั้ง
echo "Name: " . $person->getName() . "\n"; // Output: Name: Jane Smith

// พยายามกำหนดค่าที่ไม่ถูกต้อง
$person->setName(123); // Output: Error: Invalid name. Name must be a non-empty string.
echo "Name: " . $person->getName() . "\n"; // Output: Name: Jane Smith (ค่าไม่เปลี่ยนแปลง)

?>

จากตัวอย่างข้างต้น:

  • เรากำหนด Property `$name` ให้เป็น `private` เพื่อป้องกันการเข้าถึงโดยตรงจากภายนอก Class
  • เราสร้าง Getter Method ชื่อ `getName()` เพื่อให้สามารถอ่านค่า `$name` ได้
  • เราสร้าง Setter Method ชื่อ `setName()` เพื่อให้สามารถกำหนดค่า `$name` ได้
  • ภายใน Setter Method เราได้เพิ่ม Logic เพื่อตรวจสอบว่าค่าที่กำหนดเป็น String และมีความยาวมากกว่า 0 หรือไม่ ถ้าไม่เป็นไปตามเงื่อนไข จะแสดงข้อความผิดพลาด และค่า `$name` จะไม่ถูกเปลี่ยนแปลง

ข้อดีของการใช้ Getter และ Setter

  1. Encapsulation ที่ดีขึ้น: Getter และ Setter ช่วยให้เราสามารถควบคุมการเข้าถึง Properties ได้อย่างละเอียด ทำให้ Encapsulation แข็งแกร่งขึ้น
  2. Validation และ Data Sanitization: Setter Methods สามารถใช้เพื่อตรวจสอบความถูกต้องของข้อมูลก่อนที่จะถูกกำหนดให้กับ Property
  3. Code Reusability: Logic ที่เกี่ยวข้องกับการเข้าถึง Property สามารถนำกลับมาใช้ใหม่ได้
  4. Abstraction: Getter และ Setter ช่วยซ่อนรายละเอียดการ Implement ภายใน Class ทำให้ Code มีความเป็น Abstraction มากขึ้น
  5. Debugging ที่ง่ายขึ้น: การเปลี่ยนแปลงค่าของ Property ผ่าน Setter ทำให้ง่ายต่อการ Debug เพราะสามารถตรวจสอบ Logic ที่เกี่ยวข้องกับการเปลี่ยนแปลงนั้นได้
  6. การเปลี่ยนแปลงในอนาคต: หากมีการเปลี่ยนแปลงโครงสร้างภายใน Class การใช้ Getter และ Setter จะช่วยลดผลกระทบต่อ Code ที่เรียกใช้ Class นั้น

ตัวอย่างเพิ่มเติม: การใช้ Getter และ Setter กับ Property ที่มีการคำนวณ

บางครั้ง Property ไม่ได้ถูกเก็บค่าโดยตรง แต่อาจมาจากการคำนวณจาก Properties อื่นๆ ในกรณีนี้ Getter Method จะมีประโยชน์อย่างมาก:

<?php

class Rectangle {
    private $width;
    private $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getWidth() {
        return $this->width;
    }

    public function setWidth($width) {
        if ($width > 0) {
            $this->width = $width;
        }
    }

    public function getHeight() {
        return $this->height;
    }

    public function setHeight($height) {
        if ($height > 0) {
            $this->height = $height;
        }
    }

    // Getter สำหรับ Area (พื้นที่) ซึ่งคำนวณจาก width และ height
    public function getArea() {
        return $this->width * $this->height;
    }
}

$rectangle = new Rectangle(5, 10);

echo "Width: " . $rectangle->getWidth() . "\n"; // Output: Width: 5
echo "Height: " . $rectangle->getHeight() . "\n"; // Output: Height: 10
echo "Area: " . $rectangle->getArea() . "\n"; // Output: Area: 50

$rectangle->setWidth(8);
echo "New Area: " . $rectangle->getArea() . "\n"; // Output: New Area: 80

?>

ในตัวอย่างนี้ `getArea()` เป็น Getter ที่ไม่ได้คืนค่า Property โดยตรง แต่คำนวณจาก Properties `$width` และ `$height` ทุกครั้งที่เรียกใช้ ทำให้ได้ค่า Area ที่ถูกต้องเสมอ แม้ว่า `$width` หรือ `$height` จะมีการเปลี่ยนแปลง

สรุป

Getter และ Setter Methods เป็นเครื่องมือที่มีประสิทธิภาพในการควบคุมการเข้าถึง Properties ใน Class OOP ช่วยให้เราสามารถเพิ่ม Logic ต่างๆ เช่น การตรวจสอบความถูกต้องของข้อมูล การแปลงข้อมูล หรือการคำนวณค่า ทำให้ Code มีความยืดหยุ่นและบำรุงรักษาได้ง่ายขึ้น แม้ว่าอาจต้องเขียน Code เพิ่มขึ้นเล็กน้อย แต่ผลประโยชน์ที่ได้นั้นคุ้มค่าอย่างแน่นอน

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์