What is match expression in PHP

php match expression

PHP তার ভার্সন 8.0 এ match expression নামে একটি নতুন control structure চালু করেছে। “match” expression টি সাধারণ value comparisons এর জন্য traditional “switch” statement এর বিপরীতে আরও versatile অর্থাৎ বহুমুখী এবং একটি সহজ ও সংক্ষিপ্ত বিকল্প।

PHP -তে “match” expression কীভাবে কাজ করে তা নিম্নে লক্ষ্য করুন:

$value = 1;

$result = match ($value) {
    1 => 'One',
    2 => 'Two',
    3 => 'Three',
    default => 'Unknown',
};

echo $result; // Outputs 'One'

এই উদাহরণে, $value-এর মান বিভিন্ন ক্ষেত্রে compare করা হয় (এই ক্ষেত্রে, integers 1, 2, এবং 3)। যদি একটি match পাওয়া যায়, arrow (=>) ডান পাশের সংশ্লিষ্ট expression টি মূল্যায়ন করা হয় এবং $result ভেরিয়েবলে বরাদ্দ করা হয়। যদি কোন মিল পাওয়া না যায়, “default” case টি এক্সেকিউট করা হয়।

আরো একটি উদাহরণ দেখুনঃ

<?php
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

echo $return_value; //Output: This food is a cake
?>

match expression এবং switch statement এর মধ্যে পার্থক্য কি?

switch এবং match উভয়ই control flow statements যা একাধিক ভিন্ন কেসের সাথে একটি মান তুলনা করতে এবং ফলাফলের উপর নির্ভর করে ভিন্ন কোড এক্সিকিউট করতে ব্যবহার করা যেতে পারে। যাইহোক, দুটির মধ্যে কিছু মূল পার্থক্য রয়েছে:

১.Equality comparison: switch statement কে subject expression কে case এর সাথে compare করতে loose equality (==) ব্যবহার করে, অন্যদিকে match সেই জায়গায় strict equality (===) ব্যবহার করে। এর মানে হল যে switch statement টি একটি মানের সাথে মিলবে যদিও এটি একটি ভিন্ন type এর হয়, আর match expression টি তখনি মিলবে, যখন এর type একই হবে ।

নিম্নের উদাহরণ দুটি লক্ষ্য করুন :

switch statement:

<?php
$number='2';
switch($number){
    case 1:
        echo "One";
        break;
    case 2:
        echo "Two";
        break;
    default:
        echo "Unknown!";
        break;
}

//Output: Two

match expression:

<?php
$number='2';
echo match($number){
    1 => 'One',
    2 => 'Two',
    3 => 'Three',
    default => 'Unknown',
};

//Output: Unknown

২.Return value: সুইচ স্টেটমেন্ট কোনো value return করে না, অন্যদিকে match expression value return করে। এর মানে হল যে match expression টি আপনার কোডের অন্যান্য অংশে একটি expression হিসাবে ব্যবহার করা যেতে পারে, যেমন একটি function call বা assignment expression এ।

নিম্নের উদাহরণ গুলো লক্ষ্য করুন :

<?php
function my_function($foo) {
    return $foo * 2;
}

$foo = 42;

$result = match ($foo) {
    42 => my_function($foo),
    default => 'Default value',
};

echo $result; // Prints 84
<?php
$foo = 42;
$bar = 24;

[$result1,$result2] = match ($foo) {
    42 => [$foo, $bar],
    default => ['Default value', 'Default value'],
};

echo $result1; // Prints 42
echo $result2; // Prints 24
<?php
function my_function($foo, $bar) {
    return $foo + $bar;
}

$foo = 42;
$bar = 24;

[$result1, $result2] = match ($foo) {
    42 => [my_function($foo, $bar), $bar],
    default => [0, 0],
};

echo $result1; // Prints 66
echo $result2; // Prints 24

৩.Fallthrough: switch statement পরবর্তী case এ চলে যাবে যদি break statement ব্যবহার না করা হয়, অন্যদিকে match expression এটি করবেনা । এর মানে হল যে match টি আরও স্পষ্ট এবং বুঝতে পারা সহজ।

৪.Exhaustiveness: match expression টি অবশ্যই সম্পূর্ণ হতে হবে, যার অর্থ এটি অবশ্যই subject expression এর সমস্ত সম্ভাব্য value গুলি হ্যান্ডেল করতে হবে। এটি একটি default arm ব্যবহার করে করা যেতে পারে। switch statement টি সম্পূর্ণ হওয়ার প্রয়োজন নেই, তবে সম্পূর্ণ হওয়াটা সাধারণত ভাল অনুশীলন হিসাবে বিবেচিত হয়।

একটি match যদি exhaustive অর্থাৎ সম্পূর্ণ না হয়, তবে একটি UnhandledMatchError throw করে।

<?php
$condition = 5;

try {
    match ($condition) {
        1, 2 => foo(),
        3, 4 => bar(),
    };
} catch (\UnhandledMatchError $e) {
    var_dump($e);
}
?>

উপরের কোড আপনাকে নিম্নোক্ত সম্ভাব্য ফলাফল দেখাবে :

object(UnhandledMatchError)#1 (7) {
  ["message":protected]=>
  string(33) "Unhandled match value of type int"
  ["string":"Error":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(9) "/in/ICgGK"
  ["line":protected]=>
  int(6)
  ["trace":"Error":private]=>
  array(0) {
  }
  ["previous":"Error":private]=>
  NULL
}

match expression এবং switch statement এর মধ্যে পার্থক্য নিম্নে টেবিল আকারে দেওয়া হল :

Feature Switch statement Match expression
Equality comparison loosely type চেক করে। (==) Strict type চেক করে। (===)
Return value কোনো value return করেনা। একটি value return করে।
Fallthrough পরবর্তী case এ চলে যাবে যদি break statement ব্যবহার না করা হয়। পরবর্তী case এ যাবেনা।
Exhaustiveness সম্পূর্ণ হওয়ার প্রয়োজন নেই। অবশ্যই সম্পূর্ণ হতে হবে।

match expression arm গুলো কমা দ্বারা পৃথক করা একাধিক expressions থাকতে পারে। এটি একটি logical OR, এবং একই ডানদিকের একাধিক match arms এর জন্য একটি short-hand:

<?php
$result = match ($x) {
    // This match arm:
    $a, $b, $c => 5,
    // Is equivalent to these three match arms:
    $a => 5,
    $b => 5,
    $c => 5,
};
?>

একটি বিশেষ case এ default pattern। এই pattern এমন কিছুর সাথে মেলে যা আগে মেলেনি। উদাহরণ স্বরূপ:

<?php

function foo() {
    return 'foo';
}

function bar() {
    return 'bar';
}

function baz() {
    return 'baz';
}

$condition = 3;

$expressionResult = match ($condition) {
    1, 2 => foo(),
    3, 4 => bar(),
    default => baz(),
};

echo $expressionResult; // Prints "bar"
  • এই উদাহরণে, $expressionResult ভেরিয়েবলটিকে bar() ফাংশনের মান নির্ধারণ করা হবে, কারণ $condition ভেরিয়েবলের মান 3, 4 এক্সপ্রেশনের সাথে মেলে।
  • যদি $condition ভেরিয়েবলের মান 1, 2 এক্সপ্রেশনের সাথে মিলে যেত, তাহলে $expressionResult ভেরিয়েবলটিকে foo() ফাংশনের মান নির্ধারণ করা হত।
  • যদি $condition ভেরিয়েবলের মান কোনো ম্যাচ আর্মসের সাথে মেলে না, তাহলে $expressionResult ভেরিয়েবলটিকে baz() ফাংশনের মান নির্ধারণ করা হতো।

non identity check হ্যান্ডেল করতে match এর ব্যবহার

subject expression হিসাবে true ব্যবহার করে non-identity conditional case গুলো পরিচালনা করার জন্য একটি match ব্যবহার করা সম্ভব।

নিম্নের উদাহরণে integer range branch করার জন্য একটি generalized match expressions ব্যবহার করা হয়েছে :

<?php

$age = 23;

$result = match (true) {
    $age >= 65 => 'senior',
    $age >= 25 => 'adult',
    $age >= 18 => 'young adult',
    default => 'kid',
};

var_dump($result);
?>

string content branch এ একটি generalized match expressions ব্যবহার করা যেতে পারে।

<?php

$text = 'Bienvenue chez nous';

$result = match (true) {
    str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
    str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
    // ...
};

var_dump($result);
?>

এবার চলুন , match expression ব্যবহার একটা real-world উদাহরণ দেখুনঃ

<?php
function isLeapYear($year) {
    if (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)) {
        return true;
    } else {
        return false;
    }
}


function days_in_month(string $month, $year): int

{

    return match(strtolower(substr($month, 0, 3))) {

        'apr', 'jun', 'sep',  'nov'  => 30,        

        'jan', 'mar', 'may', 'jul', 'aug',  'oct', 'dec'  => 31,

        'feb' => isLeapYear($year) ? 29 : 28,

        default => throw new InvalidArgumentException("Bogus month"),

    };

}

echo days_in_month('feb',2004);

এখানে আপনি একটি year এবং month এর নাম দিলেই সেই মাসের মোট দিন সংখ্যা print করবে।

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply