Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

Anonymous Classes ใน PHP

บทนำ

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 เล็กน้อย)