Programming

แก้ปัญหา Dynamic Properties deprecated ใน php 8.2

ก่อนที่จะไปรู้วิธีการแก้ไข เราก็ต้องรู้สาเหตุก่อนว่า Dynamic Properties มันคืออะไร แล้วทำไมมันถูกยกเลิก

ก่อนที่จะไปรู้วิธีการแก้ไข เราก็ต้องรู้สาเหตุก่อนว่า Dynamic Properties มันคืออะไร แล้วทำไมมันถูกยกเลิก

ขอบคุณข้อมูลดีๆจาก : stitcher.io , php.net

Dynamic Properties คืออะไร ?

feature Dynamic Properties นี้ได้เริ่มใช้ใน PHP 5 เป็นการเพิ่ม properties ใหม่ เข้าไปใน object ขณะ runtime แทนที่จะกำหนดทุก properties ทั้งหมดไว้ก่อนใน class.

เปรียบได้เหมือนคุณกระโดดร่มไปแล้ว แต่ยังแต่งตัวไม่เสร็จ ต้องใส่แว่นตา รองเท้ากลางอากาศ

Dynamic Properties จะใช้ operator ลูกศร (->) และตามด้วยชื่อ property เช่น

$obj = new MyClass();
$obj->newProperty = 'some value';

จากตัวอย่างเราทำการสร้าง property ใหม่ ชื่อว่า “newProperty”

ถึงมันจะสะดวกสบายในการใช้ก็จริง แต่ก็ยังมีข้อเสียอยู่เหมือนกัน คือ

  • Type safety : ประเภทของ property ผิด หรือไม่เข้ากันกับการใช้งานที่ต้องการ เพราะมันเป็นการกำหนดแบบ on the fly
  • Debugging : การ Debug จะกลายเป็นเรื่องท้าทายขึ้นมาเลยทีเดียว โดยเฉพาะถ้ามีการใช้ dynamic property เยอะๆ บางทีก็อาจจะหา error ได้ยาก ว่าต้นตอที่แท้จริงมาจากไหนหรืออาจจะไม่ค่อยเข้าใจว่ามันทำหน้าที่อะไร
  • Code maintenance : บางทีก็ยากในการดูแลและแก้ไข code ภายหลัง
  • Performance : การใช้ dynamic property ส่งผลไม่ค่อยดีต่อประสิทธภาพการทำงาน โดยเฉพาะเมื่อมีการใช้กับ object ขนาดใหญ่ หรือการ access properties บ่อยๆ ทำให้มีการกิน resources มาขึ้น ระบบก็ย่อมช้าลง

ด้วยเหตุใน PHP 8.2 จัดให้ Dynamic Properties นั้น Deprecated ไป อาจจะขึ้นข้อความเตือนที่โปรแกรมของคุณว่า

Deprecated: Creation of dynamic property Post::$name is deprecated

ใช้ __get และ __set ก็ยังทำงานได้อยู่

คุณอาจกังวลในจุดนี้ เพราะมันใช้กันมากมายในบาง frameworks แต่อย่าเพิ่งตื่นตูมไป มีวิธีแก้ปัญหานี้อยู่นั่นคือใช้ __get และ __set ด้วย code นี้

class Post
{
    private array $properties = [];
    
    public function __set(string $name, mixed $value): void
    {
        $this->properties[$name] = $value;
    }
    
    // …
}

// …

$post->name = 'Name';

__set เป็น magic method ที่ถูกเรียกอัตโนมัติเมื่อไรก็ตามที่คุณ set ค่า property ที่ยังไม่ถูกกำหนดหรือเข้าถึงได้ภายใน class

ทางเลือกอื่นที่ดีกว่า

ทีม PHP ได้ทำ built-in attribute ที่เรียกกว่า AllowDynamicProperties มาให้ เราสามารถเรียกใช้มัน และ code ก็ใช้เดิมๆ ได้เลย เช่น

#[\AllowDynamicProperties]
class Post
{
}

$post = new Post();

$post->name = 'Name'; // All fine

ลองนำไปประยุกต์ใช้กันดูครับ

Tags