跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

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 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务