PHP Hiện Đại: Khám Phá Các Tính Năng trong PHP 8.3 và 8.4

· 4 min read

Các PHP developer gần đây được chiều đãi. Với sự phát hành của PHP 8.3 và PHP 8.4 gần đây hơn, ngôn ngữ đang trở nên biểu cảm, ngắn gọn và vững chắc hơn.

Vì chúng ta đang chạy blog này trên stack hiện đại, hãy khám phá một số tính năng yêu thích của người dùng mà bạn nên sử dụng trong các dự án Laravel của mình ngay hôm nay.

1. Property Hook (PHP 8.4)

Đây được cho là thay đổi lớn nhất kể từ attribute. Property hook cho phép bạn định nghĩa logic getset trực tiếp trên property, loại bỏ nhu cầu về các method getter/setter dài dòng.

Trước:

class User
{
    private string $firstName;
    private string $lastName;

    public function getFullName(): string {
        return $this->firstName . ' ' . $this->lastName;
    }

    public function setFirstName(string $value): void {
        $this->firstName = ucfirst($value);
    }
}

Sau (PHP 8.4):

class User
{
    public string $firstName {
        set(string $value) => ucfirst($value);
    }

    public string $lastName;

    public string $fullName {
        get => $this->firstName . ' ' . $this->lastName;
    }
}

Điều này giảm đáng kể boilerplate code trong DTO và Value Object.

2. Các Hàm Array Find (PHP 8.4)

Cuối cùng! Chúng ta không còn cần sử dụng array_filter chỉ để tìm một item. PHP 8.4 giới thiệu array_find, array_find_key, array_any, và array_all.

$users = [
    ['id' => 1, 'name' => 'Alice', 'active' => false],
    ['id' => 2, 'name' => 'Bob', 'active' => true],
];

// PHP 8.4
$activeUser = array_find($users, fn($user) => $user['active']);

// Output: ['id' => 2, 'name' => 'Bob', 'active' => true]

Trong Laravel collection, chúng ta đã có firstWhere từ lâu, nhưng có điều này native trong PHP là chiến thắng lớn cho hiệu năng và các script không dùng Laravel.

3. Typed Class Constant (PHP 8.3)

PHP 8.3 cho phép chúng ta chỉ định type cho class constant. Điều này thêm sự rõ ràng và ngăn chặn breaking change vô tình trong các child class.

interface Status
{
    const string PENDING = 'pending';
    const int TIMEOUT = 30; // giây
}

class OrderStatus implements Status
{
    // Fatal error: Cannot use array as value for class constant 
    // Status::PENDING of type string
    const string PENDING = []; 
}

4. json_validate() (PHP 8.3)

Kiểm tra xem một string có phải JSON hợp lệ hay không trước đây yêu cầu decode nó (sử dụng bộ nhớ) và kiểm tra lỗi.

// Cách cũ
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
    // không hợp lệ
}

// Cách mới (PHP 8.3)
if (json_validate($json)) {
    // hợp lệ!
}

Điều này hiệu quả hơn nhiều cho logic validation, đặc biệt khi bạn không cần data đã decode ngay lập tức.

5. Protected Class Constant trong Final Class

Trong các phiên bản cũ hơn, bạn không thể khai báo constant là private hoặc protected nếu nó là một phần của interface implementation. Nhưng quan trọng hơn, các quy tắc visibility giờ nhất quán hơn.

Kết Luận

Bước nhảy từ PHP 8.1/8.2 sang 8.4 có vẻ tăng dần, nhưng các tính năng như Property Hook thay đổi cơ bản cách chúng ta thiết kế class. Chúng làm cho cuộc tranh luận "anemic domain model" vs "rich domain model" dễ điều hướng hơn nhiều bằng cách giảm syntax tax của rich model.

Đảm bảo composer.json của bạn đã sẵn sàng:

"require": {
    "php": "^8.4"
}

Bình luận