มีอะไรใหม่ใน PHP8.3

4 พฤศจิกายน 2566 เวลาอ่าน 2 นาที
มีอะไรใหม่ใน PHP8.3

ใน 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/ 

 

 

 

เรื่องใน
PHP
Phattarachai Chaimongkol

เกี่ยวกับ phattarachai.dev

ผมอ๊อฟนะครับ เป็นผู้ประกอบการอิสระ ที่ปรึกษาทางด้าน Web Application Development ให้แก่องค์กร ธุรกิจ SME และหน่วยงานราชการ
Web Developer ผู้มีใจรักใน Laravel เป็นพาร์ทเนอร์บริษัท Digital Agency ชั้นนำทางด้าน UX/UI เพื่อพัฒนาโปรเจคให้แก่ลูกค้า ผมช่วยสร้างเครื่องมือทางด้าน Web ที่มีคุณภาพให้ผู้ประกอบการดำเนินธุรกิจได้ง่ายขึ้นใช้งานได้จริง เน้นประสบการณ์ ความชำนาญ ผลงานคุ้มค่าเทียบเท่าจ้างงานกับบริษัทใหญ่ ๆ

ยามว่าง ๆ ชอบเล่นเกมส์บน Steam ครับ

เรื่องที่เกี่ยวข้อง

PHP function แสดงขนาดไฟล์แบบคนอ่านรู้เรื่อง เป็น KB, MB, GB
4 พฤศจิกายน 2566
PHP function แสดงขนาดไฟล์แบบคนอ่านรู้เรื่อง เป็น KB, MB, GB
คำสั่ง Postgresql ที่เอาไว้ใช้จัดการเกี่ยวกับ Replication
4 พฤศจิกายน 2566
คำสั่ง Postgresql ที่เอาไว้ใช้จัดการเกี่ยวกับ Replication
สรุป Taylor Otwell Keynote ใน Laracon US 2024 - Inertia 2.0, VS Code Extension และ Laravel Cloud
4 พฤศจิกายน 2566
สรุป Taylor Otwell Keynote ใน Laracon US 2024 - Inertia 2.0, VS Code Extension และ Laravel Cloud