PHP 8: match hay là switch?

192

Bài viết được sự cho phép của tác giả Nguyễn Trần Chung

PHP 8 sẽ giới thiệu một biểu thức mới “match“. Một tính năng mạnh mẽ và sẽ là sự lựa chọn tốt hơn so với “switch“. Vậy chính xác sự khác biệt là gì?

  10 PHP Instagram Scripts & Widgets tốt nhất
  10 Frameworks tốt nhất hiện nay cho PHP

Hãy bắt đầu bằng cách so sánh cả hai. Đây là một ví dụ về “switch” cổ điển:

switch ($statusCode) {
    case 200:
    case 300:
        $message = null;
        break;
    case 400:
        $message = 'not found';
        break;
    case 500:
        $message = 'server error';
        break;
    default:
        $message = 'unknown status code';
        break;
}

Đoạn code ở dưới đây sẽ tương đương với ở trên khi dùng biểu thức “match“:

$message = match ($statusCode) {
    200, 300 => null,
    400 => 'not found',
    500 => 'server error',
    default => 'unknown status code',
};

Trước hết, biểu thức khớp ngắn hơn đáng kể:

  • nó không yêu cầu break statement
  • nó có thể kết hợp các trường hợp giống nhau thành một bằng dấu phẩy
  • nó trả về một giá trị, vì vậy bạn chỉ phải gán giá trị một lần

Nhưng thậm chí còn nhiều hơn thế!

Không ép kiểu

match sẽ kiểm tra loại nghiêm ngặt thay vì kiểm tra lỏng lẻo. Giống như sử dụng === thay vì ==. Mọi người có thể sẽ không đồng ý liệu đó có phải là điều tốt hay không, nhưng đó là một chủ đề riêng chúng ta sẽ bàn sau.

$statusCode = '200';

$message = match ($statusCode) {
    200 => null,
    default => 'unknown status code',
};

// Kết quả trả về
// $message = 'unknown status code'

Giá trị không xác định gây ra lỗi

Nếu bạn quên kiểm tra giá trị và khi không có nhánh default được chỉ định, PHP sẽ đưa ra ngoại lệ UnhandledMatchError. Tuy kiểm tra chặt chẽ, nhưng nó sẽ ngăn chặn các lỗi nhỏ nhặt không được chú ý.

$statusCode = 400;

$message = match ($statusCode) {
    200 => 'perfect',
};

// UnhandledMatchError sẽ throw

Hiện tại chỉ có các biểu thức một dòng

Bạn chỉ có thể viết một biểu thức trên một dùng. Các khối biểu thức có thể sẽ được thêm vào tại một thời điểm nào đó, nhưng vẫn chưa rõ chính xác khi nào 😂.

Kết hợp điều kiện

match có thể kết hợp nhiều điều kiện lại với nhau và viết trên 1 dòng ngăn cách bởi dấu phẩy

$message = match ($statusCode) {
    200, 300, 301, 302 => 'combined expressions',
};

Throwing exceptions

Trong PHP 8 có thay đổi về cách dùng throw trước đây throw chỉ bắt đầu từ câu lệnh thì giờ có thể bắt đầu từ biểu thức, nghĩa là bạn có thể throw exception ở giá trị 500 mà k phải cần đưa vào trong hàm

$message = match ($statusCode) {
    200 => null,
    500 => throw new ServerError(),
    default => 'unknown status code',
};

Pattern matching

Ok, có một điều nữa: Pattern matching. Đây là một kỹ thuật được sử dụng trong các ngôn ngữ lập trình khác, để cho phép kết hợp phức tạp hơn các giá trị đơn giản. Hãy nghĩ về nó như regex, nhưng đối với các biến thay vì văn bản.

Pattern matching không được hỗ trợ ngay bây giờ, vì đây là một tính năng khá phức tạp, nhưng Ilija Tovilo (tác giả RFC) đã đề cập đến nó như là một tính năng có thể có trong tương lai.

Vậy thì, switch hay là match?

match với phiên bản chặt chẽ và hiện đại hơn so với người anh switch

Trong một số trường hợp switch sẽ cung cấp linh hoạt hơn so với match, đặc biệt là với các khối code có nhiều dòng. Tuy nhiên, sự nghiêm ngặt của toán tử match là hấp dẫn và pattern matching sẽ là một yếu tố thay đổi cuộc chơi cho PHP.

Tôi thừa nhận tôi chưa bao giờ viết một switch statement trong những năm qua vì nhiều điều kỳ quặc của nó. Vì vậy, trong khi nó chưa hoàn hảo, nhưng có những trường hợp sử dụng được thì match sẽ là một sự lựa chọn tốt đối với tôi.

Ý kiến của bạn là gì, hãy để lại bình luận nhé!

Dịch từ stitcher.io

Bài viết gốc được đăng tải tại chungnguyen.xyz

Có thể bạn quan tâm:

Xem thêm các tuyển dụng lập trình viên php hấp dẫn tại TopDev