في هذا الدرس 6تصفّح المواضيع
قدم إصدار PHP 8.0 تعبير المطابقة الحديث match لحل أكبر ثلاث مشاكل في جملة switch التقليدية: المقارنة المرنة، والانزلاق غير المقصود، وكثرة الأسطر التكرارية.
- يقارن
matchالقيم بصرامة تامة باستخدام===بدلاً من المقارنة المرنة==. - يُرجع كل مسار (Arm) قيمة مباشرة عبر السهم
=>ولا ينزلق أبداً للمسار التالي؛ فلا حاجة ولا مكان للأمرbreak;. - يُعد
matchتعبيراً برمجياً حقيقياً (Expression) يمكن إسناد نتيجته مباشرة إلى متغير أو طباعتها عبرecho.
يتم تقييم كتلة match ($httpCode) { ... }; بالكامل لإرجاع القيمة "OK" وإسنادها مباشرة إلى $statusText.
<?php
$httpCode = 200;
$statusText = match ($httpCode) {
200 => "OK",
301 => "Moved Permanently",
404 => "Not Found",
500 => "Internal Server Error",
default => "Unknown HTTP Code",
};
echo "$httpCode: $statusText\n";
يتكون كل مسار (Arm) في تعبير match من قيمة شرط أو أكثر، يليها سهم مزدوج =>، ثم تعبير واحد يتم إرجاع نتيجته مباشرة.
- افصل بين كل مسار والذي يليه بفاصلة
,؛ ويُنصح بوضع فاصلة ختامية بعد المسار الأخير وفق أسلوب PHP الحديث. - يمكنك استخدام
matchمباشرة داخل العمليات الحسابية أو جمل الطباعةecho. - يجب أن يكون الطرف الأيمن بعد السهم
=>تعبيراً واحداً يُرجع قيمة، وليس كتلة أوامر متعددة الأسطر.
يُرجع التعبير match ($tier) العدد العشري 0.20 مباشرة داخل $discountRate ليُستخدم في حساب السعر النهائي.
<?php
$tier = "gold";
$basePrice = 100.00;
$discountRate = match ($tier) {
"silver" => 0.10,
"gold" => 0.20,
"platinum" => 0.30,
default => 0.00,
};
$finalPrice = $basePrice * (1 - $discountRate);
echo "Tier: $tier | Final Price: $finalPrice\n";
على عكس switch، يجري match دائماً مقارنة تطابق صارمة (===)، مما يمنع أخطاء الخلط التلقائي بين النصوص والأعداد والقيم المنطقية.
- في
match، النص"200"لن يتطابق أبداً مع المسار الرقمي200 => .... - العدد الصحيح
0لن يتطابق معfalseأوnullأو النص الفارغ"". - تعمل المقارنة الصارمة تلقائياً في
matchحتى لو لم يتم كتابةdeclare(strict_types=1).
لأن $rawInput نص "1"، يتخطى match العدد الصحيح 1 والقيمة المنطقية true ويطابق فقط المسار النصي "1".
<?php
$rawInput = "1";
$result = match ($rawInput) {
1 => "Matched integer 1",
true => "Matched boolean true",
"1" => "Matched string '1' strictly",
default => "Other",
};
echo "$result\n";
بدلاً من تكديس أسطر case: الفارغة كما في switch، يتيح لك match دمج عدة قيم في مسار واحد مفصولة بفواصل.
- اكتب
200, 201, 204 => "Success"لمطابقة أي قيمة منها في سطر واحد أنيق. - يقيّم PHP الشروط المفصولة بفواصل من اليسار إلى اليمين ويتوقف فور تطابق أحدها.
- يمكنك أيضاً استخدام الصيغة
match (true)لبناء جداول فحص النطاقات بأسلوب مختصر.
تتطابق القيمة 204 مع القيمة الثالثة في المسار الأول المدمج بالفاصلة 200, 201, 204 => "2xx Success".
<?php
$statusCode = 204;
$category = match ($statusCode) {
200, 201, 204 => "2xx Success",
301, 302, 307, 308 => "3xx Redirection",
400, 401, 403, 404 => "4xx Client Error",
default => "5xx or Custom Status",
};
echo "HTTP $statusCode -> $category\n";
على عكس switch، يشترط تعبير match الشمولية الكاملة (Exhaustiveness): فإذا لم يتطابق أي مسار ولم يوجد مسار default، يطلق PHP خطأ UnhandledMatchError فوراً!
- بما أن
matchملزم بإرجاع قيمة، فلا يمكنه التخطي بصمت عند عدم تطابق أي مسار. - إطلاق خطأ
UnhandledMatchErrorيكشف القيم غير المتوقعة فوراً بدلاً من تمرير بيانات ناقصة بصمت. - أضف دائماً المسار الافتراضي
default => ...عندما تكون القيم المدخلة مفتوحة الاحتمالات.
تضمين المسار default => "127.0.0.1" يضمن حصول $dbHost دائماً على عنوان صالح دون المخاطرة بحدوث UnhandledMatchError.
<?php
$env = "staging";
$dbHost = match ($env) {
"production" => "db.prod.internal",
"staging", "testing" => "db.stage.internal",
default => "127.0.0.1",
};
echo "Connected host: $dbHost\n";
في تطوير PHP 8.3 / 8.4 الحديث، يُعد match الخيار الافتراضي لتحويل القيم وربطها، بينما تبقى switch مفيدة فقط لكتل الأوامر الإجرائية متعددة الأسطر.
- فضّل
matchدائماً عند تحويل قيمة مدخلة أو شرطmatch (true)إلى قيمة مخرجة. - تذكر دائماً الفاصلة المنقوطة
};في نهاية تعبيرmatch. - لا تضع أبداً الأمر
break;داخل مساراتmatch.
يُقيّم match (true) كل مسار منطقي بالترتيب الصارم ويُرجع "Gold Mastery" للدرجة 92.
| وجه المقارنة | تعبير match الحديث (PHP 8+) | جملة switch التقليدية |
|---|---|---|
| معامل المقارنة | تطابق صارم في القيمة والنوع (===) | مساواة مرنة (==) |
| إرجاع قيمة مباشرة | نعم (تعبير يُسند لمتغير) | لا (كتلة أوامر إجرائية) |
| السقوط التلقائي | لا يسقط أبداً (لا يحتاج break) | يسقط للحالة التالية ما لم تكتب break; |
| تجميع عدة قيم | مفصولة بفاصلة: 1, 2 => ... | عناوين مكدسة: case 1: case 2: |
غياب التطابق وdefault | يرمي خطأ UnhandledMatchError | يتجاهل التنفيذ بصمت |
<?php
$score = 92;
$badge = match (true) {
$score >= 90 => "Gold Mastery",
$score >= 75 => "Silver Proficiency",
$score >= 60 => "Bronze Pass",
default => "Needs Practice",
};
echo "Score $score -> $badge\n";
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
في تطوير PHP 8.3 / 8.4 الحديث، يُعد match الخيار الافتراضي لتحويل القيم وربطها، بينما تبقى switch مفيدة فقط لكتل الأوامر الإجرائية متعددة الأسطر. فضّل match دائماً عند تحويل قيمة مدخلة أو شرط match (true) إلى قيمة مخرجة. تذكر دائماً الفاصلة المنقوطة }; في نهاية تعبير match. لا تضع أبداً الأمر break; داخل مسارات match.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Match Expression تعبير match
- تعلّم تعبير المطابقة الحديث match في PHP 8 بأسلوب PHP 8 الحديث مع أمثلة عملية وتطبيقات تفاعلية.
- للمراجعة
- 02 Why PHP 8 Introduced match لماذا ظهرت بنية match الحديثة
- المفهوم الأساسي لقسم لماذا ظهرت بنية match الحديثة في لغة PHP الحديثة.
- للمراجعة
- 03 Match Expression Return Value إرجاع القيمة مباشرة من match
- الصياغة البرمجية والتطبيق العملي المباشر لقسم إرجاع القيمة مباشرة من match.
- للمراجعة
- 04 Strict Identity Check in match المقارنة الصارمة للنوع والقيمة
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم المقارنة الصارمة للنوع والقيمة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PHP PHP
- PHP: Hypertext Preprocessor
- لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
- للمراجعة
- 02 CLI CLI
- Command-Line Interface
- واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
- للمراجعة
- 03 FPM FPM
- FastCGI Process Manager
- مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
- للمراجعة
- 04 HTML HTML
- HyperText Markup Language
- لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم لماذا ظهرت بنية match الحديثة للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم إرجاع القيمة مباشرة من match وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
أي معامل مقارنة يستخدمه تعبير match في PHP 8 عند مقارنة القيمة بكل مسار؟
يستخدم match دائماً التطابق الصارم === بغض النظر عن إعداد strict_types.
ماذا يحدث إذا لم يتطابق أي مسار في تعبير match ولم يتم توفير المسار الافتراضي default؟
يجب أن يكون match شاملاً ولذلك يطلق خطأ UnhandledMatchError عند عدم تطابق أي مسار.
كيف تدمج عدة قيم في مسار واحد داخل تعبير match؟
يدعم match فصل عدة شروط بفواصل في نفس المسار قبل السهم =>.
هل يحتاج مسار تعبير match إلى الأمر break; لمنع الانزلاق للمسار التالي؟
كل مسار في match يقيم تعبيراً واحداً ويرجع نتيجته فوراً دون انزلاق.
ماذا يرجع التعبير match ("200") { 200 => "Int", "200" => "String", default => "Other" } ؟
لأن match يستخدم ===، يتخطى النص "200" العدد 200 ويطابق النص "200".
لماذا يجب وضع فاصلة منقوطة }; بعد قوس الإغلاق عند إسناد تعبير match إلى متغير؟
كل جملة إسناد في PHP يجب أن تنتهي بفاصلة منقوطة.
كيف يمكنك استخدام تعبير match لتقييم شروط النطاقات مثل $score >= 90؟
المطابقة مع القيمة المنطقية true تنفذ أول مسار تكون نتيجة شرطه true.
ما الرمز الذي يفصل بين الشرط وقيمة الإرجاع داخل مسار تعبير match؟
تستخدم مسارات match صيغة الشرط ثم السهم المزدوج => ثم القيمة.