A clear concept on PHP enum in Bangla
Tags: php, tutorial, programming, webdev
Published: 2022-02-22 08:19:01

## **Enumeration বা enum কি?** 
enum হলো একধরনের কাস্টম টাইপ । আরো স্পষ্ট করে বললে একধরনে স্পেশাল ক্লাস, যেখানে আমরা constants ও methods লিখতে পারি। PHP 8.1 আমাদের সাথে এই ফিচারের পরিচয় করিয়ে দেয়, যা এর আগের ভার্সন গুলোতে সাপোর্ট করতো না । 


## **শুরুর আগে, একটি ছোট সমস্যা নিয়ে চিন্তা করি**


```
Order::where('delivery_status',1)->take(10)->get();
```
এই Query এর মাধ্যমে orders table থেকে ১০ টি করে ডাটা নেওয়া হচ্ছে, যেখানে delivery_status = 1 

সমস্যা হলো আপনি জানেনা যে delivery_status 1 বলতে আসলে কি বোঝানো হচ্ছে, কারণ এই প্রজেক্টে এ আপনাকে নতুন এসাইন করা হয়েছে । তখন আপনি অন্য টিম মেম্বরের থেকে ব্যাপারটা জানতে পারলেন যে, 

> delivery_status = 1 মানে pending
> delivery_status = 2 মানে processing
> delivery_status = 3 মানে delivered

ব্যাপারটা এমন ও হতে পারতো আপনার অন্যটিম মেম্বরদের ও মনে নেই, কারণ প্রজেক্টটি অনেক আগেই শেষ হয়েছে। তখন আপনাকে আবশ্যই প্রজেক্টের ডকুমেন্টেশন দেখতে হবে, কিন্তু আনেক সময় দেখা যায় কোন ডকুমেন্টেশন থাকে না। এক্ষেত্রে আপনাকে পুরো প্রজেক্টের যেখানে যেখানে এমন query আছে সবকিছু চেক করে স্টেপ বাই স্টেপ বুঝতে হবে ।

এমন পরিস্থিতে আপনি code এর readability বাড়ানোর জন্য Order ক্লাসের মধ্যে delivery_status গুলোর const declar করলেন

```
    const PENDING = 1;
    const PROCESSING = 2;
    const DELIVERED = 3;
```
এবং query তে delivery_status 1,2 এর পরিবর্তে এই const গুলো ব্যবহার করলেন 

```
Order::where('delivery_status',Order::PENDING)->take(10)->get();

```
এখন আপনার কোডের readability বাড়লো ঠিক কিন্তু আপনি চান delivery_status এ int ছাড়া অন্য কিছু পাস না করতে সেক্ষত্রে getDeliveryStatus নামে একটি protected method লিখলেন যেখনে ‍int value ছাড়া অন্য কিছু পাস করা যাবেনা ।

```
public function index()
{
    return $this->getDeliveryStatus(Order::PENDING);
}

protected function getDeliveryStatus(int $status)
{
    return Order::where('delivery_status',$status)->take(10)->get();
}
```

এখানে আপনার requirement অনুযায়ী int ছাড়া অন্য কোন ভ্যালু পাস করা যাচ্ছেনা কিন্তু যেকোন int ভ্যালু পাস করা যায়।
এটাও বেশ ভালোই ঝামেলা কারন আমাদের তো শুধু 1,2,3 এই তিনটা status আছে । সুতারং এখন দরকার শুধুমাত্র এই status const ছাড়া বাকি কোন কিছু এর পাস করা যাবেনা এমন কিছু করার, আর এই ধরনের সমস্যা থেকে খুব সহজেই মুক্তি দিবে  
enumeration বা enum 

## **PHP enum সম্পর্কে বিস্তারিত : **

PHP তে `enum` keyword এর মাধ্যমে Enums ডিক্লিয়ার করতে হয় । এর systax অনেকটা class, trait, interface এর মতই

```
enum Status{
    case Pending;
    case Processing;
    case Delivered;
}
```
এখন Pending case টি প্রিন্ট করে দেখি,

```
print_r(Status::Pending);
```
Output :

```
Status Enum
(
    [name] => Pending
)
```
যা আসলে আমাদের একটি অবজেক্ট রির্টান করে । এখন 
আমরা চাই speacific  ভাবে name প্রিন্ট করতে সেক্ষেত্রে,

```
echo Status::Pending->name; //output Pending
```

**Backed Enums :**

Backed enum হলো একধনের enum, যেখানে আমরা enum এর রির্টন টাইপ বলে দিতে পারি এবং enum case এর মধ্যে int বা string ভ্যালু রাখতে পারি ।

```
enum Status:int{
    case PENDING = 1;
    case PROCESSING = 2;
    case DELIVERED = 3;
}
```
এবার যাদি এখান থেকে কোন একটি case কে আমারা print_r() এর মধ্যমে প্রিন্ট করি তাহলে দেখতে পাবো প্রতিটি object এ name এবং value থাকে ।

```
print_r(Status::PENDING);
```
Output :

```
Status Enum:int
(
    [name] => PENDING
    [value] => 1
)
```
এখান থেকে আমার speacific ভাবে name / value কে ‍access করতে পারবো ।

```
echo Status::PENDING->value; //output : 1
echo Status::PENDING->name; //output : PENDING
```

<br><br>

## **চলুন এবার আমরা আমাদের পূর্বে সমস্যাটি enum দিয়ে সমাধান করি**

আমরা DeliveryStatus নামে একটি Backed enum ডিক্লিয়ার করবো যার return type হবে int 

```
enum DeliveryStatus:int {
    case PENDING = 1;
    case PROCESSING = 2;
    case DELIVERED = 3;
}
```

এবং আমাদের getDeliveryStatus মেথডে int এর পরিবর্তে 
 DeliveryStatus enum দিয়ে দিব তহলে এই enum এর মধ্য থাকা case ছাড়া অন্য কিছু পাস করা যাবে না ।

```
public function index()
{
    return $this->getDeliveryStatus(DeliveryStatus::PENDING);
}

protected function getDeliveryStatus(DeliveryStatus $status)
{
    return Order::where('delivery_status',$status)->take(10)->get();
}
```

_নোট: যেহেতু enum PHP 8.1 এর একটি ফিচাই তাই enum লেখার আগে অবশ্যই আপনার computer / server এর PHP version চেক করে নিবেন ।_