سالها بود که توسعهدهندههای PHP برای مدیریت مقادیر ثابت، وضعیتها و نقشها مجبور بودند از constantها یا رشتههای متنی استفاده کنند. اما با معرفی Enumها در PHP 8.1، این روند تغییر کرد و حالا میتوانیم با استفاده از یک ویژگی رسمی، کدی تمیزتر، امنتر و خواناتر بنویسیم.
در این مقاله قصد دارم به شکلی کاربردی نشان بدم که چرا Enumها یک قابلیت "لوکس" نیستند، بلکه برای نوشتن کلینکد واقعی در پروژههای Laravel و PHP حیاتیاند.
Enum (مخفف "Enumeration") یک نوع دادهای خاص است که اجازه میدهد مجموعهای از مقادیر ثابت و تعریفشده را داشته باشیم. برخلاف constantهای سنتی، enumها type-safe هستند و IDE بهراحتی میتواند آنها را تشخیص دهد.
مثالی ساده:
فرض کنید میخواهیم وضعیتهای سفارش را مشخص کنیم. قبل از PHP 8.1:
const STATUS_PENDING = 'pending';
const STATUS_APPROVED = 'approved';
const STATUS_REJECTED = 'rejected';اما با Enumها:
enum OrderStatus: string {
case Pending = 'pending';
case Approved = 'approved';
case Rejected = 'rejected';
}و از این به بعد در کل پروژه میتونی از OrderStatus::Approved استفاده کنی بدون ترس از اشتباه تایپی.
با enumها، PHP مطمئن میشود که فقط مقادیر تعریفشده استفاده میشوند. دیگه خبری از رشتههای ناقص یا اشتباه نیست.
وقتی کد رو میخونی و میبینی OrderStatus::Rejected، فوراً متوجه عملکرد اون بخش میشی.
اکثر IDEها (مثل PHPStorm) autocomplete برای enumها دارند و این توسعه رو سریعتر و با خطای کمتر میکنه.
میتونی داخل enum متد تعریف کنی. مثلاً:
enum OrderStatus: string {
case Pending = 'pending';
case Approved = 'approved';
case Rejected = 'rejected';
public function isFinal(): bool {
return $this === self::Approved || $this === self::Rejected;
}
}یکی از کاربردیترین جاها برای استفاده از enum، مدلهای Eloquent هست. فرض کن در جدول سفارشها یک فیلد status داریم:
use App\Enums\OrderStatus;
protected $casts = [
'status' => OrderStatus::class,
];هنگام کار با مدل:
$order->status = OrderStatus::Pending;
if ($order->status === OrderStatus::Rejected) {
// do something
}Enum ها فقط از PHP 8.1 به بعد در دسترس هستند.
اگر از Enum در فرمها یا API استفاده میکنی، بهتره مقدار آن را validate کنی (مثلاً با in_array یا Rule custom).
Enumها میتونن Backed Enum (با مقدار string یا int) یا Pure Enum (بدون مقدار) باشند.