ก่อนที่จะไปรู้วิธีการแก้ไข เราก็ต้องรู้สาเหตุก่อนว่า 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
ลองนำไปประยุกต์ใช้กันดูครับ
command line ตรวจสอบ spec ใน Windows OS
วิธีผูก วินิจฉัย (Diagnosis) กับ วัคซีน (Vaccine)
ETL ใน Data Engineering คืออะไร?
แก้ปัญหา export ภาษาไทยเพี้ยน ของ MySQL ใน phpMyAdmin
เชื่อมตารางตัวเองใน MySQL ด้วย SELF JOIN
เคล็ดลับเพิ่มประสิทธิภาพการใช้ Google Docs
เทคนิคการใช้ ChatGPT Plus ให้คุ้มค่า คุ้มราคา
เชื่อมหลายฐานข้อมูล MySQL ใน Codeigniter4