Trong PHP, từ phiên bản PHP 8.1 trở đi, Enumerations (enum) đã được giới thiệu để đại diện cho tập hợp các hằng số có tên (named constants), tương tự như enum trong các ngôn ngữ như Java, C#.

Dưới đây là giải thích chi tiết cách sử dụng enum trong PHP, bao gồm cả enum thuần (pure enum)enum có giá trị (backed enum).


1. Định nghĩa Enum cơ bản (Pure Enum)

enum Status {
    case Pending;
    case Approved;
    case Rejected;
}

Cách sử dụng:

$status = Status::Pending;

if ($status === Status::Approved) {
    echo "Đã được duyệt.";
}

✅ Đặc điểm:

  • Không có giá trị cụ thể (như string/int).
  • Mỗi case là một instance duy nhất.

2. Enum có giá trị (Backed Enum)

enum Role: string {
    case Admin = 'admin';
    case Editor = 'editor';
    case Viewer = 'viewer';
}

Cách sử dụng:

$role = Role::Admin;
echo $role->value; // Kết quả: admin

// Hoặc lấy từ value
$roleFromValue = Role::from('editor');
echo $roleFromValue->name; // Editor

✅ Ưu điểm:

  • Có thể chuyển đổi qua lại giữa tên enum và giá trị.
  • Hữu ích trong lưu trữ database hoặc truyền API.

3. Thêm phương thức trong Enum

Enum có thể có method, thuộc tính, và cả constructor.

enum PaymentStatus: string {
    case Paid = 'paid';
    case Unpaid = 'unpaid';
    case Refunded = 'refunded';

    public function label(): string {
        return match($this) {
            self::Paid => 'Đã thanh toán',
            self::Unpaid => 'Chưa thanh toán',
            self::Refunded => 'Đã hoàn tiền',
        };
    }
}

Sử dụng:

$status = PaymentStatus::Paid;
echo $status->label(); // Đã thanh toán

4. Sử dụng trong switch/match

$status = Status::Approved;

match ($status) {
    Status::Pending => 'Đang chờ',
    Status::Approved => 'Đã duyệt',
    Status::Rejected => 'Từ chối',
};

5. Enum trong thực tế (ví dụ trong Laravel hoặc app PHP thuần)

  • Lưu trạng thái đơn hàng (OrderStatus)
  • Vai trò người dùng (UserRole)
  • Loại bài viết (PostType)
  • Giao thức kết nối (ConnectionType)

6. Một số hàm hữu ích với Enum

Role::cases(); // Trả về mảng tất cả các case
foreach (Role::cases() as $role) {
    echo $role->name . ' => ' . $role->value . PHP_EOL;
}

7. Giới hạn & lưu ý

  • Enum không thể kế thừa enum khác.
  • Không hỗ trợ các giá trị phức tạp như mảng hay object trong backed enum.
  • Backed enum chỉ hỗ trợ kiểu string hoặc int.

Nếu bạn đang dùng PHP < 8.1, bạn sẽ phải dùng class hằng số giả enum như:

class Status {
    const Pending = 'pending';
    const Approved = 'approved';
    const Rejected = 'rejected';
}

Nhưng đây chỉ là mô phỏng và không có tính năng như enum thật.