Những tính năng PHP 8 đáng dùng: từ match đến readonly

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

PHP bây giờ không còn là ngôn ngữ của những đoạn script lộn xộn như nhiều người nhớ. Từ PHP 8 trở đi, ngôn ngữ có nhiều tính năng giúp code ngắn hơn, an toàn hơn. Hãy cùng điểm qua những thứ bạn nên dùng hằng ngày.

Constructor property promotion

Trước đây khai báo thuộc tính và gán trong hàm khởi tạo mất nhiều dòng lặp lại. Giờ bạn gộp chúng lại:

class Product{    public function __construct(        public string $name,        public float $price,        private int $stock = 0,    ) {}}

Ba thuộc tính được khai báo và gán chỉ trong một khối. Code gọn hơn rõ rệt, nhất là với các class dữ liệu.

Named arguments

Khi hàm có nhiều tham số, truyền theo tên giúp code tự giải thích và cho phép bỏ qua tham số tùy chọn ở giữa:

$p = new Product(name: 'Bàn phím', price: 450000.0);str_contains(haystack: $text, needle: 'php');

Union types và kiểu rõ ràng

Bạn có thể khai báo một giá trị chấp nhận nhiều kiểu, thay vì chú thích mơ hồ trong comment:

function formatId(int|string $id): string{    return 'ID-' . $id;}

Kết hợp với declare(strict_types=1); ở đầu file, PHP sẽ không tự ép kiểu ngầm, giúp lộ ra lỗi sớm hơn. Ngoài ra còn có kiểu mixed, never, static và kiểu trả về void để mô tả chính xác ý định của hàm.

match: switch mạnh hơn

match là biểu thức trả về giá trị, so sánh chặt (như ===), không cần break và ném lỗi nếu không khớp trường hợp nào:

$label = match ($status) {    'paid'    => 'Đã thanh toán',    'pending' => 'Đang chờ',    'failed', 'cancelled' => 'Không thành công',    default   => 'Không rõ',};

Nếu bỏ default mà gặp giá trị lạ, PHP ném UnhandledMatchError, giúp bạn không bỏ sót trường hợp một cách im lặng.

Nullsafe operator

Chuỗi truy cập có thể gặp null giờ không cần hàng loạt câu if:

$city = $user?->profile?->address?->city ?? 'Chưa cập nhật';

Enum và readonly (PHP 8.1 trở lên)

Enum thay thế các hằng số rời rạc bằng kiểu có giới hạn giá trị:

enum OrderStatus: string{    case Pending = 'pending';    case Paid    = 'paid';    public function label(): string    {        return match ($this) {            self::Pending => 'Đang chờ',            self::Paid    => 'Đã thanh toán',        };    }}$s = OrderStatus::from('paid');echo $s->label();

Thuộc tính readonly chỉ cho gán một lần, rất hợp với đối tượng giá trị bất biến:

final class Money{    public function __construct(        public readonly int $amount,        public readonly string $currency,    ) {}}

Một vài điểm nhỏ nhưng tiện

  • str_contains, str_starts_with, str_ends_with thay cho strpos khó đọc.
  • Toán tử ??= gán nếu chưa có giá trị.
  • Arrow function fn ($x) => $x * 2 cho các callback ngắn.
  • Spread cho mảng có khóa chuỗi từ PHP 8.1.

Nâng cấp PHP cho dự án cũ

Nếu dự án của bạn đang chạy PHP 7, việc nâng lên 8 là cơ hội dọn dẹp. Hãy bắt đầu bằng cách chạy bộ test hiện có, sau đó dùng công cụ phân tích tĩnh như PHPStan hoặc Psalm để tìm các chỗ không tương thích. Một số thay đổi hành vi cần chú ý: so sánh chuỗi với số theo quy tắc mới, các hàm bị loại bỏ, và nhiều cảnh báo được nâng thành ngoại lệ. Làm từng bước nhỏ, mỗi bước chạy lại test, sẽ an toàn hơn nâng một lần lớn.

Ngoài việc sửa tương thích, bạn có thể dùng công cụ tự động như Rector để chuyển đổi cú pháp cũ sang cú pháp mới, ví dụ biến các hàm khởi tạo dài dòng thành constructor promotion. Nhớ rà soát kết quả bằng mắt trước khi commit, vì công cụ chỉ là trợ thủ chứ không thay thế được phán đoán của bạn.

Phong cách code PHP hiện đại

Ngoài các tính năng ngôn ngữ, cộng đồng PHP đã thống nhất nhiều quy ước: dùng Composer để quản lý thư viện, tuân theo chuẩn PSR cho phong cách code và tự động nạp class, và chạy công cụ định dạng như Laravel Pint hoặc PHP CS Fixer để cả nhóm có cùng cách viết. Kết hợp kiểu dữ liệu rõ ràng với phân tích tĩnh, bạn bắt được rất nhiều lỗi ngay khi viết thay vì chờ đến khi chạy. Đây là lý do một dự án PHP hiện đại có cảm giác gần với các ngôn ngữ có kiểu chặt hơn so với hình ảnh cũ mà nhiều người còn nhớ.

Kết luận

Hãy kiểm tra phiên bản PHP dự án của bạn đang chạy và nâng dần nếu có thể, vì các bản cũ không còn được hỗ trợ bảo mật. Bắt đầu áp dụng constructor promotion, match và enum trong code mới, bạn sẽ cảm nhận ngay sự khác biệt về độ gọn và an toàn.

Nếu muốn luyện tập cùng bài tập thực tế, hãy ghé các khóa học tại codebem.com khi bạn sẵn sàng.

author_photo
Nguyễn Đình Cường

0 comment