บทนำ
Anonymous Class คือคลาสที่ไม่มีชื่อ ใช้สำหรับการใช้งานครั้งเดียว (One-time use) หรือเมื่อต้องการสร้างคลาสแบบ Ad-hoc เปิดตัวมาตั้งแต่ PHP 7
Definition อยู่ภายใน Expression ที่คืนค่า Object ของคลาสนั้น ใช้ Syntax new class:
Syntax
<?php
$obj = new class {
public function sayhello() {
echo "Hello World";
}
};
$obj->sayhello();
?>
ความสามารถของ Anonymous Class
Anonymous Class ทำได้ทุกอย่างที่ Normal Class ทำได้:
- Extend Class อื่น
- Implement Interface
- Use Trait
ตัวอย่าง: Extends และ Implements
<?php
class parentclass {
public function test1() {
echo "test1 method in parent class\n";
}
}
interface parentinterface {
public function test2();
}
$obj = new class() extends parentclass implements parentinterface {
public function test2() {
echo "implements test2 method from interface";
}
};
$obj->test1();
$obj->test2();
?>
ผลลัพธ์
test1 method in parent class implements test2 method from interface
Nested Anonymous Class
Anonymous Class สามารถ Nest อยู่ในเมธอดของคลาสอื่นได้ แต่ Object ของมัน ไม่เข้าถึง private/protected members ของ Outer Class ได้:
<?php
class testclass {
public function test1() {
return new class() {
public function test2() {
echo "test2 method of nested anonymous class";
}
};
}
}
$obj2 = new testclass();
$obj2->test1()->test2();
?>
ผลลัพธ์
test2 method of nested anonymous class
Internal Name ของ Anonymous Class
PHP Parser ให้ชื่อ Unique สำหรับการใช้งานภายใน:
<?php
var_dump(get_class(new class() {} ));
?>
ผลลัพธ์
string(60) "class@anonymous/home/cg/root/1569997/main.php0x7f1ba68da026"
Use Cases ของ Anonymous Class
- Callbacks/Event Handlers - สร้าง Handler แบบ Inline
- Testing/Mocking - สร้าง Mock Object ชั่วคราว
- Simple DTOs - Object สำหรับถ่ายโอนข้อมูลครั้งเดียว
- Strategy Pattern - Implement Interface แบบ Ad-hoc
ตัวอย่าง Use Case: Simple Callback
<?php
function process(callable $callback) {
$callback();
}
process(new class {
public function __invoke() {
echo "Processing...\n";
}
});
?>
ข้อจำกัด
- ไม่สามารถ Serialize ได้ (PHP 7.4+ รองรับบางส่วน)
- ไม่มีชื่อ จึงไม่สามารถ Type Hint ด้วยชื่อคลาสได้
- แต่ละครั้งที่ Execute จะสร้าง Class Definition ใหม่ (Performance Impact เล็กน้อย)