Cách dùng Enum trong PHP 8

Enum là một trong số tính năng cơ bản của nhiều ngôn ngữ lập trình và PHP cũng không ngoại lệ. Dưới đây là mọi điều bạn cần biết về Enum trong PHP.

Enum trong PHP

Enumeration (enum) là một kiểu dữ liệu mà bạn có thể dùng để lưu một giá trị từ một bộ tùy chỉnh. Chúng là lựa chọn hoàn hảo để đại diện cho kiểu tùy chọn mà bạn có thể hiện trong một danh sách thả xuống.

PHP 8.1 hiện đã hỗ trợ enum. Sử dụng enum rất dễ nhưng chúng cung cấp thêm các tính năng được mượn từ lập trình hướng đối tượng.

Tác dụng của Enum

Enum hữu ích khi bạn muốn làm việc với một tập hợp cố định các giá trị liên quan. Ví dụ, bạn có thể dùng một enum để đại diện cho các bộ trong một gói thẻ hoặc kiểu phương tiện.

Enum của PHP khá phức tạp, với một số tính năng được vay mượn từ các lớp (class). Bạn có thể dùng chúng trong kết hợp với gợi ý kiểu để viết code dễ đoán và chặt chẽ hơn.

Enum cơ bản

Enum thường lưu trữ các giá trị vô hướng. Chúng tương tự như các kiểu dữ liệu nguyên thủy của C, dù enum của PHP có thể chứa những giá trị chuỗi cũng như số nguyên. Tuy nhiên, mặc định, những giá trị enum của PHP không có giá trị vô hướng tương đương. Chúng được gọi là enum cơ bản:

enum Season
{
    case Spring;
    case Summer;
    case Autumn;
    case Winter;
}

Lưu ý cách PHP dùng lại từ khóa case mà bạn sẽ gặp phải trong lệnh switch. Những giá trị enum đại diện chỉ là tên của các trường hợp. Bạn có thể tham chiếu tới một giá trị enum cụ thể bằng lệnh sau:

EnumTypeName::EnumField

Ví dụ, để tham chiếu tới mùa đông, dùng:

Season::Winter

Bạn có thể gắn giá trị này cho một biến và kiểm tra nó dựa trên những giá trị Season khác:

$favorite = Season::Summer;
 
if ($favorite == get_current_season()) {
    echo "It's my favorite season!";
}

Dùng gợi ý kiểu, bạn có thể giới hạn các tham số hay kiểu trả về tới một enum cụ thể. Điều này giúp tránh một loạt lỗi và việc chỉnh sửa code cũng dễ dàng hơn:

function get_current_season(): Season
{
    $day = date("z");
 
    if ($day < 59 || $day > 333) return Season::Winter;
    if ($day < 151) return Season::Spring;
    if ($day < 243) return Season::Summer;
    if ($day < 334) return Season::Autumn;
}

Nếu hàm get_current_season cố gắng trả về một giá trị khác, không phải Season, PHP sẽ phát sinh lỗi TypeError nghiêm trọng.

Enum được hỗ trợ

PHP dùng thuật ngữ “backed enum” để tham chiếu tới một enum cùng với các giá trị. Chúng có thể là số nguyên hoặc chuỗi:

enum Month: int
{
    case Jan = 1;
    case Feb = 2;
    //...
}

Bạn cần khai báo kiểu enum được hỗ trợ và nó phải là int hoặc string. Bạn có thể truy cập giá trị cơ bản bằng cách dùng thuộc tính value chỉ đọc:

echo Month::Jan->value;

Khi dùng enum được hỗ trợ, bạn cũng có thể chuyển đổi chúng, từ giá trị vô hướng tương đương, bằng phương thức from:

var_dump(Month::from(2));

Các phương thức enum

PHP enum cũng có các phương thức, khiến chúng hơi giống một lớp rút gọn. Điều này cho thấy vị trí của PHP, nằm giữa ngôn ngữ theo thủ tục và hướng đối tượng.

Ví dụ, bạn có thể thêm phương thức đơn giản này vào enum Month để lấy số ngày từ một giá trị cụ thể:

/* Note: no leap-year handling! */
function daysInMonth(): int {
    if ($this == Month::Feb) return 28;
    if (in_array($this, array(Month::Apr, Month::Jun, Month::Sep, Month::Nov))) return 30;
    return 31;
}

Lưu ý, bạn có thể dùng $this để tham chiếu tới một giá trị enum cụ thể, giống như bạn dùng $this để tham chiếu tới một đối tượng nhất định. Bạn cũng có thể dùng toán tử ngang bằng chuẩn, ==, để so sánh các giá trị enum.

Enum cũng hỗ trợ các phương thức tĩnh. Ví dụ:

static function random(): Month {
    return Month::from(rand(1, count(Month::cases())));
}

Trên đây là những điều bạn cần biết về enum trong PHP. HI vọng bài viết hữu ích với các bạn.

Thứ Ba, 07/02/2023 16:50
31 👨 977
0 Bình luận
Sắp xếp theo
    ❖ Học PHP