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ì?
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 .
Ứng tuyển ngay các vị trí PHP tuyển dụng mới nhất trên TopDev
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:
- 5 tips để trở thành một coder giỏi hơn mỗi ngày!
- Code PHP làm sao cho sạch (Phần 1)
- Hướng dẫn dùng biến trong CSS để làm dark/light mode
Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev