Menu
flag Ar iconالعربيةdown icon

العامل الثلاثي في PHP: الصيغة المختصرة ?: والتداخل

العامل الثلاثي في PHP جملة if/else في سطر واحد: $result = $condition ? 'yes' : 'no';. تعرّف على الصيغة المختصرة ?: (عامل Elvis)، وكيف تختلف عن ??، ولماذا يحتاج العامل الثلاثي المتداخل إلى أقواس منذ PHP 8، ومتى تكون match الخيار الأنظف.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

العامل الثلاثي جملة if/else تتسع في تعبير واحد: condition ? valueIfTrue : valueIfFalse. يعيد إحدى القيمتين، لذا يمكنك إسناده أو طباعته بـ echo أو تمريره إلى دالة.

غيّر $age إلى 15 و$items إلى 3 وشغّل الكود مرة أخرى. لاحظ الأقواس حول العامل الثلاثي في السطر الأخير: دونها ستربط . النصوص أولًا ولن تكون النتيجة ما تريد.

العامل الثلاثي في قوالب HTML

العامل الثلاثي هو الطريقة المعتادة لاختيار صنف CSS أو تسمية أو سمة داخل قالب. يقرأ هذا المثال ?stock= من الرابط: شغّله، ثم انقر الروابط في تبويب Page فيُنفَّذ السكربت نفسه مرة أخرى بقيمة مختلفة.

<?= ... ?> اختصار لـ <?php echo ... ?>، وهذا يبقي الشروط ذات السطر الواحد مقروءة داخل الوسوم.

العامل الثلاثي المختصر ?: (عامل Elvis)

احذف الجزء الأوسط فتحصل على $a ?: $b: يعيد $a عندما تكون $a صحيحة منطقيًا، وإلا $b. وهو مفيد للقيم الافتراضية عندما يجب أن يرجع النص الفارغ أو 0 أيضًا إلى البديل.

القيم الخاطئة منطقيًا هي false و0 و0.0 و"" و"0" و[] وnull. فإذا كانت "0" إجابة حقيقية في بياناتك (حقل كمية، أو رمز PIN)، فسيتخلص منها العامل الثلاثي المختصر.

?: مقابل ??

يتشابهان في الشكل لكنهما يتحققان من أشياء مختلفة. يرجع ?: إلى البديل عندما يكون الطرف الأيسر خاطئًا منطقيًا. أما ?? فلا يرجع إلى البديل إلا عندما يكون الطرف الأيسر null أو غير معيَّن، ولا يحذّر من متغير أو مفتاح مصفوفة مفقود.

استخدم ?? لحالة «قد لا تكون القيمة موجودة» (بيانات الطلب، ومصفوفات الإعدادات، والمفاتيح الاختيارية). واستخدم ?: لحالة «القيمة موجودة لكنها قد تكون فارغة». تشرح صفحة عامل الدمج مع null العاملين ?? و??= بالتفصيل.

العامل الثلاثي المتداخل يحتاج إلى أقواس

كانت PHP 7 تقرأ a ? b : c ? d : e من اليسار إلى اليمين، بخلاف كل اللغات الأخرى تقريبًا، فكانت تنتج نتائج خاطئة. أما PHP 8 فترفض التخمين:

<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error:  Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2

أضف أقواسًا حول العامل الثلاثي الداخلي فيعمل:

العامل الثلاثي المختصر هو الاستثناء: $a ?: $b ?: $c مسموح دون أقواس، كما في مثال Elvis أعلاه.

استخدم match(true) عندما يكون هناك أكثر من فرعين

العامل الثلاثي المتداخل بثلاثة أو أربعة مستويات صعب القراءة حتى مع الأقواس. تتحقق match مع true موضوعًا لها من الشروط من الأعلى إلى الأسفل وتعيد أول فرع مطابق:

احتفظ بالعامل الثلاثي لنتيجتين في سطر واحد، والجأ إلى match أو سلسلة if/elseif بمجرد أن تحتاج إلى نتيجة ثالثة.

الأسئلة الشائعة

ما العامل الثلاثي في PHP؟

صيغة مختصرة لـ if/else تعيد قيمة: $label = $age >= 18 ? 'adult' : 'minor';. إذا كان الشرط قبل ? صحيحًا، يُستخدم التعبير بعد ?، وإلا فالتعبير بعد :.

ماذا يعني ?: في PHP؟

$a ?: $b هو العامل الثلاثي المختصر (ويُسمى أيضًا عامل Elvis). يعيد $a إذا كانت $a صحيحة منطقيًا و$b في غير ذلك، لذا فإن '' ?: 'default' تساوي 'default'. وهو مثل $a ? $a : $b، لكن $a تُقيَّم مرة واحدة فقط.

هل يمكن تداخل العوامل الثلاثية في PHP؟

فقط مع الأقواس. منذ PHP 8، تُعد $a ? 'x' : $b ? 'y' : 'z' خطأً قاتلًا، فاكتب $a ? 'x' : ($b ? 'y' : 'z'). ولأكثر من فرعين، تكون match(true) أو سلسلة if/elseif أسهل في القراءة.

هل يمكنني استخدام العامل الثلاثي دون جزء else؟

لا، يحتاج العامل الثلاثي دائمًا إلى الفرعين. لعبارة "استخدم هذه القيمة أو ارجع إلى بديل" اكتب $x ?: 'default' أو $x ?? 'default'، ولتنفيذ شيء فقط عندما يتحقق شرط، اكتب if عادية أو $condition && doSomething();.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن