PHP Control Structures
What is match expression in PHP
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 করবে।