ก่อนที่จะไปรู้วิธีการแก้ไข เราก็ต้องรู้สาเหตุก่อนว่า 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
ลองนำไปประยุกต์ใช้กันดูครับ
ขั้นตอนการติดตั้ง Vuetify ใน Laravel
3 เทคนิค เพิ่มความเร็วใน Laravel
ฟังก์ชันวันเวลาที่น่าสนใจใน MySQL
เคล็ดลับการเรียงลำดับข้อมูลใน MySQL
เชื่อมตารางตัวเองใน MySQL ด้วย SELF JOIN
เคล็ดลับเพิ่มประสิทธิภาพการใช้ Google Docs
เทคนิคการใช้ ChatGPT Plus ให้คุ้มค่า คุ้มราคา
เชื่อมหลายฐานข้อมูล MySQL ใน Codeigniter4