Enum được thêm vào PHP 8.1 chắc mọi người cũng đã biết về PHP 8.1 rồi. Thật sự quá tuyệt với, tôi rất thích
Trong Enum chúng ta có thể cài đặt các kiểu giá trị cho biến, thông thường chúng ta thường thấy việc cài đặt các kiểu giá trị cho biến trong React, Vue, React Native, sử dụng bởi (type, interface)
Bây giờ chúng ta có thể làm điều tương tự như vậy bằng Enum
// 🎉 using enum add type string value enum UserRole : string{ case Admin = 'Administrator'; case Guest = 'Guest'; public function label(): string { return match($this) { UserRole::Admin => 'Hello Administrator', UserRole::Guest => 'Hello Guest', }; } }
Trong code trên ta dùng cấu hình enum UserRole, thuộc loại "string" và bên trong ta có thể cài đặt các trường hợp trả về cho từng biến
À tôi thường thấy nhiều người viết code theo cú pháp sau, cũng như tôi ban đầu chưa dùng qua enum cũng viết giống vậy
if($user_id===1) echo "Administrator"; else echo "Guest";
Cho đến khi tôi sử dụng được Enum thì sẽ code như sau:
// ✅ if($user_id===1) echo UserRole::Admin->label(); else{ // hoặc UserRole::Guest->value echo UserRole::Guest->label(); }
Các bạn thấy đấy, đoạn code khi dùng Enum nó trông thật là phi thường và mạnh mẻ hơn rất nhiều, nhìn đoạn code đó giúp ta dễ dàng nâng cấp, dễ chỉnh sửa cho nó.
FullCode
// 🎉 using enum add type string value enum UserRole : string{ case Admin = 'Administrator'; case Guest = 'Guest'; public function label(): string { return match($this) { UserRole::Admin => 'Hello Administrator', UserRole::Guest => 'Hello Guest', }; } } // 🚀 : login , we can check Auth::user()->id, after when login $user_id = 1; // ❌ if($user_id===1) echo "Administrator"; else echo "Guest"; // ✅ if($user_id===1) echo UserRole::Admin->label(); else{ // hoặc UserRole::Guest->value echo UserRole::Guest->label(); }
Ví dụ khác:
<?php enum OrderStatus: string { case PENDING = 'pending'; case PROCESSING = 'processing'; case SHIPPED = 'shipped'; case DELIVERED = 'delivered'; // Phương thức để trả về nhãn (label) của trạng thái public function label(): string { return match($this) { OrderStatus::PENDING => 'Đang chờ xử lý', OrderStatus::PROCESSING => 'Đang xử lý', OrderStatus::SHIPPED => 'Đã giao hàng', OrderStatus::DELIVERED => 'Đã nhận hàng', }; } }
Tạo lớp Order để quản lý đơn hàng
<?php class Order { public int $id; public float $totalPrice; public OrderStatus $status; public function __construct(int $id, float $totalPrice, OrderStatus $status) { $this->id = $id; $this->totalPrice = $totalPrice; $this->status = $status; } // Phương thức để cập nhật trạng thái đơn hàng public function updateStatus(OrderStatus $newStatus): void { $this->status = $newStatus; } // Phương thức để hiển thị thông tin đơn hàng public function displayOrder(): void { echo "Order ID: " . $this->id . "\n"; echo "Total Price: $" . $this->totalPrice . "\n"; echo "Status: " . $this->status->label() . "\n"; } }
Sử dụng lớp Order và enum OrderStatus trong giỏ hàng
// Giả sử chúng ta có một số đơn hàng trong giỏ hàng $order1 = new Order(1, 99.99, OrderStatus::PENDING); $order2 = new Order(2, 149.99, OrderStatus::PROCESSING); // Hiển thị thông tin đơn hàng ban đầu $order1->displayOrder(); // Đang chờ xử lý $order2->displayOrder(); // Đang xử lý // Cập nhật trạng thái đơn hàng sau khi giao hàng $order1->updateStatus(OrderStatus::SHIPPED); $order2->updateStatus(OrderStatus::DELIVERED); // Hiển thị lại thông tin đơn hàng sau khi cập nhật trạng thái echo "\nSau khi cập nhật trạng thái:\n"; $order1->displayOrder(); // Đã giao hàng $order2->displayOrder(); // Đã nhận hàng
Sẽ được kết quả sau:
Order ID: 1 Total Price: $99.99 Status: Đang chờ xử lý Order ID: 2 Total Price: $149.99 Status: Đang xử lý Sau khi cập nhật trạng thái: Order ID: 1 Total Price: $99.99 Status: Đã giao hàng Order ID: 2 Total Price: $149.99 Status: Đã nhận hàng