Static Properties และ Methods: การเข้าถึงโดยไม่ต้องสร้าง Object
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ Abstract Classes และ Abstract Methods ซึ่งเป็นเครื่องมือสำคัญในการสร้างโครงสร้างที่ยืดหยุ่นให้กับโค้ดของเรา ในบทนี้ เราจะมาทำความรู้จักกับอีกหนึ่งคุณสมบัติที่น่าสนใจของ Class ใน PHP นั่นคือ Static Properties และ Static Methods ซึ่งทำให้เราสามารถเข้าถึงข้อมูลและฟังก์ชันการทำงานภายใน Class ได้โดยไม่ต้องสร้าง Object ของ Class นั้นๆ
ความหมายของ Static Properties และ Methods
Static Properties คือ ตัวแปรที่ถูกประกาศไว้ภายใน Class โดยใช้ keyword static และเป็นของ Class นั้นๆ โดยตรง ไม่ใช่ของแต่ละ Object ที่สร้างจาก Class นั้น นั่นหมายความว่า Static Properties จะมีเพียงค่าเดียวใน Class นั้นๆ ไม่ว่าเราจะสร้าง Object กี่ตัวก็ตาม
Static Methods ก็เช่นกัน คือ ฟังก์ชันที่ถูกประกาศไว้ภายใน Class โดยใช้ keyword static และเป็นของ Class นั้นๆ โดยตรง ไม่ใช่ของแต่ละ Object ที่สร้างจาก Class นั้น Static Methods สามารถเข้าถึง Static Properties ของ Class ได้ แต่ไม่สามารถเข้าถึง Properties ที่ไม่ใช่ Static (instance properties) ได้
การประกาศ Static Properties และ Methods
การประกาศ Static Properties และ Methods ทำได้ง่ายๆ โดยการเพิ่ม keyword static หน้า Properties หรือ Method ที่ต้องการให้เป็น Static
class Counter {
public static $count = 0; // Static Property
public static function increment() { // Static Method
self::$count++;
}
}
ในตัวอย่างนี้ เราได้สร้าง Class ชื่อ Counter ซึ่งมี Static Property ชื่อ $count และ Static Method ชื่อ increment() สังเกตว่าเราใช้ public เพื่อให้สามารถเข้าถึง Static Property และ Method จากภายนอก Class ได้ (เราจะพูดถึง Access Modifiers อีกครั้งในภายหลัง)
การเข้าถึง Static Properties และ Methods
เนื่องจาก Static Properties และ Methods เป็นของ Class โดยตรง ไม่ใช่ของ Object ดังนั้นเราจึงไม่สามารถเข้าถึงโดยใช้ -> เหมือนกับการเข้าถึง Properties และ Methods ทั่วไป แต่เราจะใช้ :: (scope resolution operator) แทน
// เข้าถึง Static Property
echo Counter::$count; // Output: 0
// เรียกใช้ Static Method
Counter::increment();
echo Counter::$count; // Output: 1
สังเกตว่าเราใช้ Counter::$count และ Counter::increment() เพื่อเข้าถึง Static Property และเรียกใช้ Static Method โดยไม่ต้องสร้าง Object ของ Class Counter เลย
ภายใน Static Method เราสามารถอ้างอิงถึง Static Properties อื่นๆ ใน Class เดียวกันได้โดยใช้ keyword self ตามด้วย :: และชื่อ Property เช่น self::$count
Access Modifiers กับ Static Properties และ Methods
เช่นเดียวกับ Properties และ Methods ทั่วไป เราสามารถกำหนด Access Modifiers (public, protected, private) ให้กับ Static Properties และ Methods ได้ เพื่อควบคุมการเข้าถึงจากภายนอก Class
- public: สามารถเข้าถึงได้จากทุกที่ ทั้งภายในและภายนอก Class
- protected: สามารถเข้าถึงได้จากภายใน Class และ Class ลูก (ที่สืบทอดมาจาก Class นี้)
- private: สามารถเข้าถึงได้จากภายใน Class เท่านั้น
ตัวอย่าง:
class Database {
private static $connection = null;
public static function getConnection() {
if (self::$connection === null) {
self::$connection = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password');
}
return self::$connection;
}
}
// ไม่สามารถเข้าถึง Database::$connection โดยตรง (private)
// echo Database::$connection; // Error!
// เข้าถึงผ่าน Static Method (public)
$db = Database::getConnection();
ในตัวอย่างนี้ เราได้สร้าง Class Database ซึ่งมี Static Property ชื่อ $connection ที่เป็น private ทำให้ไม่สามารถเข้าถึงจากภายนอก Class ได้ แต่เรามี Static Method ชื่อ getConnection() ที่เป็น public ซึ่งจะสร้าง Connection (ถ้ายังไม่มี) และ return Connection นั้นออกมา ทำให้เราสามารถเข้าถึง Database Connection ได้อย่างปลอดภัย
กรณีใช้งานจริงของ Static Properties และ Methods
Static Properties และ Methods มีประโยชน์ในหลายกรณี เช่น:
- เก็บค่าคงที่ (Constants) ที่เกี่ยวข้องกับ Class นั้นๆ: เช่น ค่า default, version, หรือ configuration
- สร้าง Utility Methods ที่ไม่ต้องพึ่งพา Object: เช่น ฟังก์ชันสำหรับ validate ข้อมูล, format ข้อมูล, หรือ generate ID
- จัดการ Singleton Pattern: ทำให้มั่นใจได้ว่าจะมี Object ของ Class นั้นๆ เพียงตัวเดียวในระบบ
- จัดการ Database Connection: อย่างที่เห็นในตัวอย่างก่อนหน้านี้
ตัวอย่าง Utility Method:
class StringHelper {
public static function isPalindrome($string) {
$string = strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $string));
return $string === strrev($string);
}
}
echo StringHelper::isPalindrome("A man, a plan, a canal: Panama"); // Output: 1 (true)
echo StringHelper::isPalindrome("hello"); // Output: (false)
ข้อผิดพลาดที่พบบ่อย
ข้อผิดพลาดที่พบบ่อยในการใช้ Static Properties และ Methods คือ:
- พยายามเข้าถึง Static Properties หรือ Methods โดยใช้
->: ต้องใช้::เท่านั้น - พยายามเข้าถึง Properties ที่ไม่ใช่ Static (instance properties) ภายใน Static Method: Static Methods ไม่สามารถเข้าถึง Properties ที่เป็นของ Object ได้
- ลืมกำหนด Access Modifier: ทำให้ Properties หรือ Methods ถูกเข้าถึงโดยไม่ได้รับอนุญาต
ตัวอย่างข้อผิดพลาด:
class MyClass {
public $name = "My Object";
public static function getName() {
// return $this->name; // Error! Cannot use $this in a static method
return "My Class"; // Correct
}
}
$obj = new MyClass();
// echo $obj::getName(); // Error! ต้องใช้ Class::method()
echo MyClass::getName(); // Correct
สรุป
Static Properties และ Methods เป็นเครื่องมือที่มีประโยชน์ในการเขียนโปรแกรมเชิงวัตถุ PHP ช่วยให้เราสามารถเข้าถึงข้อมูลและฟังก์ชันการทำงานภายใน Class ได้โดยไม่ต้องสร้าง Object ทำให้โค้ดของเรามีความยืดหยุ่นและง่ายต่อการบำรุงรักษามากขึ้น อย่างไรก็ตาม การใช้งาน Static Properties และ Methods ควรทำด้วยความระมัดระวัง เพื่อไม่ให้เกิดข้อผิดพลาดที่ไม่คาดฝัน
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับการกำหนดค่าคงที่ (Constants) ใน Class ซึ่งเป็นอีกหนึ่งคุณสมบัติที่น่าสนใจของ PHP OOP