มีอะไรใหม่ใน PHP8.3
-thumb.jpg)
ใน PHP 8.3 ที่ถูกปล่อยมาในช่วงปลายปี 2566 (23 พ.ย. 66) ได้มีส่วนที่พัฒนาเพิ่มเติมมาหลายอย่าง เช่น คลาสแบบ readonly ฟังก์ชัน json_validate() การตรวจสอบ Stack overflow และอื่นหลายอย่างนะครับ
ในบทความนี้ผมจะลองมาไล่ดูฟีเจอร์ใหม่ ๆ เอามาเท่าที่น่าสนใจ และเราน่าจะได้ใช้งานในการเขียนโค๊ดทั่ว ๆ ไปกันนะครับ
Type class constants
ปกติเวลาประกาศ const ในคลาส จะทำได้แค่ระบุชื่อ const แต่ไม่สามารถ type hint คลาสได้ ใน PHP 8.3 เราสามารถ ประกาศ class ของ const ได้แล้วครับ
class Post
{
// < PHP 8.3
const STATUS_DRAFT = 'draft';
// PHP 8.3 ทำได้แล้ว
const string STATUS_PUBLIC = 'public';
}
RFC: https://wiki.php.net/rfc/typed_class_constants
แอตทริบิวต์ #[Override]
แอตทริบิวต์ #[Override] ใช้เพื่อบอกเจตขนาองเมธอดในคลาสว่าเมธอดนี้ตองโอเวอร์ไรด์ เมธอดใน parent คลาสนะครับ ทีนี้ถ้าบนคลาสแม่ ชื่อเมธอดมีการเปลี่ยนแปลง แปลว่าคลาสลูกไม่ได้ override เมธอดอะไรอีกแล้ว ก็จะมีการ throw error ออกมา
ตัวอย่าง:
abstract class Parent
{
public function methodWithDefaultImplementation(): int
{
return 1;
}
}
class Child extends Parent
{
#[Override]
public function methodWithDefaultImplementation(): int
{
return 2; // เมธอดนี้ override จาจาก คลาสแม่
}
}
ทีนี้ถ้าคลาสแม่เปลี่ยนชื่อเมธอดไปเป็นชื่ออื่น
abstract class Parent
{
public function methodWithNewImplementation(): int
{
return 1;
}
}
เจ้าตัวแอตทริบิวต์ #[Override]
ก็จะรู้ว่า Child::methodWithDefaultImplementation()
ไม่ได้ override เมธอดอะไรมาอีก ก็จะ throw error ออกมา
RFC: https://wiki.php.net/rfc/marking_overriden_methods
Index แบบติดลบใน Array
สมมติถ้าเรามี array เปล่า แล้วเราเพิ่ม item ไปใน index ติดลบ (-1, -2, ...) แล้วมีการเพิ่ม item ถัดมา item นั้น จะเริ่มที่ index 0 เสมอ เช่น
// ก่อน PHP 8.3
$array = [];
$array[-5] = 'a';
$array[] = 'b';
var_export($array);
//array (
// -5 => 'a',
// 0 => 'b',
//)
ทีนี้จากตัวอย่างด้านบน ถ้าเรามีการเพิ่ม item ถัดไปต่อจาก -5 index นั้นจะกลายเป็น -4
//array (
// -5 => 'a',
// -4 => 'b',
//)
คลาส anonymous แบบ readonly
ก่อนหน้านี้เราไม่สามารถสร้าง คลาส anonymous แบบ readonly ได้ แต่เราสามารถทำได้แล้วใน PHP 8.3
$class = new readonly class {
public function __construct(
public string $foo = 'bar',
) {}
};
เพิ่มฟังก์ชัน json_validate()
ก่อนหน้านี้ถ้าเราต้องการรู้ว่า string ที่เราระบุเข้ามาสามารถแปลงเป็น JSON ได้ถูกต้องมั้ย เราต้องทำการ decode แล้ว เช็คดูว่ามีการ throw error ออกมามั้ย แต่ใน PHP 8.3 มีฟังก์ชัน json_validate() เพิ่มขึ้นมาเพื่อใช้เช็คว่า String ที่ระบุเข้ามาเป็นรูปแบบ JSON ที่ถูกต้องมั้ย และ ฟังก์ชันนี้มีการใช้งานเมโมรี่น้อยกว่าการ decode string ออกมาทดสอบอีกด้วยครับ
json_validate(string $json, int $depth = 512, int $flags = 0): bool
RFC: https://wiki.php.net/rfc/json_validate
การเรียก constant ของคลาสแบบ dynamic
PHP 8.3 ยอมให้เรียกค่าคงที่โดยใช้ syntax แบบ dynamic ได้มากขึ้น
class Foo
{
const BAR = 'bar';
}
$name = 'BAR';
// ก่อน PHP 8.3 เรียกได้แบบนี้
constant(Foo::class . '::' . $name);
// PHP 8.3
Foo::{$name};
ใน PHP8.3 ยังมีการเปลี่ยนแปลง เล็ก ๆ น้อย ๆ เพื่อปรับปรุงประสิทธิภาพ และมี deprecated บางฟังก์ชันที่ยกเลิกการใช้งาน สามารถอ่านเพิ่มเติมได้จากที่มาครับ
ที่มา
- https://stitcher.io/blog/new-in-php-83
- https://php.watch/versions/8.3
** Update
นอกจากนี้ PHPStorm Version 2023.3 ก็ได้ออก update มาให้รองรับ PHP 8.3 แล้วด้วยเช่นกัน แล้วยังมี AI Assistant เปิดให้ใช้งานเป็น General Availability ไม่ต้องรอ waiting list กันต่อไปแล้วด้วยใน version นี้ครับ
https://www.jetbrains.com/phpstorm/whatsnew/2023-3/