Elvis vs Null Coalescing: السلاح السري لمطور PHP

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Elvis vs Null Coalescing: أين يكمن الفرق؟ (تحليل معمق في PHP)

\n\n

مرحبًا يا زميل! إذا كنت قد كتبت أي كود بلغة PHP، فبالتأكيد واجهت موقفًا تحتاج فيه إلى التحقق من وجود متغير، واستخدام قيمته إذا كان موجودًا، أو تعيين قيمة افتراضية إذا لم يكن. تبدو مهمة بسيطة، لكنها بالضبط النقطة التي يتعثر فيها المبتدئون (وحتى المحترفون) بين عاملين متشابهين جدًا ولكن مختلفين جوهريًا: short-ternary (Elvis operator) ?: و null coalescing operator ??.

\n\n

هذا واحد من أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات والتصويتات). وليس من دون سبب: الفرق بينهما ليس مجرد فضول أكاديمي. اختيار العامل الخاطئ قد يؤدي إلى أخطاء ستقضي ساعات في تتبعها. دعنا نفهم نهائيًا ما يحدث "تحت الغطاء" ومتى نستخدم كلًا منهما.

\n\n

مقدمة سريعة: لماذا نحتاج هذه العوامل؟

\n\n

تخيل أنك تكتب كودًا لعرض اسم المستخدم. إذا لم يكن هناك اسم، نعرض "ضيف". الطريقة التقليدية هي استخدام if:

\n\n
if (isset($userName)) {\n    $displayName = $userName;\n} else {\n    $displayName = 'ضيف';\n}
\n\n

هذا يعمل، لكنه طويل. تقدم PHP اختصارات أنيقة. وهنا نصل إلى المعضلة الرئيسية: ?: أم ??؟ للوهلة الأولى، يبدوان متطابقين. لكن هذا فقط للوهلة الأولى.

\n\n

1. عامل Elvis (?:) — "ملك القيم المنطقية"

\n\n

عامل Elvis (سُمي بهذا الاسم لتشابهه مع تسريحة شعر ملك الروك أند رول: ?: — عينان وأنف وخصلة شعر) ظهر في PHP منذ الإصدار 5.3. وهو صيغة مختصرة للعامل الثلاثي (ternary operator).

\n\n

الصيغة:

\n
$result = $expression ?: $default;
\n\n

ماذا يعني هذا؟ ينظر المفسر إلى $expression. إذا كان يتحول إلى true (أي ليس قيمة "خاطئة")، يتم إرجاع $expression. إذا كان $expression قيمة "خاطئة" (false، 0، سلسلة فارغة، null، مصفوفة فارغة، إلخ)، يتم إرجاع $default.

\n\n

نقطة مهمة: عامل Elvis لا يتحقق من وجود المتغير. إنه يتحقق من صحته المنطقية. إذا كان المتغير غير معرّف، ستحصل على Notice: Undefined index/variable.

\n\n

مثال مع مفاجأة:

\n
$count = 0;\n$result = $count ?: 10;\necho $result; // سيطبع 10، وليس 0!
\n\n

لماذا؟ لأن 0 قيمة "خاطئة" (falsy). اعتبر Elvis أن المتغير "فارغ" وأعطى القيمة البديلة. هذا يفاجئ الكثيرين.

\n\n

2. عامل Null Coalescing (??) — "المنقذ من أخطاء Notice"

\n\n

عامل null coalescing ظهر في PHP 7.0 ولقي ترحيبًا حارًا. قوته الخارقة الرئيسية هي أنه يتعامل بأمان مع المتغيرات غير الموجودة دون التسبب في أخطاء.

\n\n

الصيغة:

\n
$result = $expression ?? $default;
\n\n

ماذا يعني هذا؟ يتحقق العامل من وجود $expression و أنه لا يساوي null. إذا كان الأمر كذلك، يُرجع $expression. وإلا، يُرجع $default.

\n\n

الفرق الجوهري: ?? يتجاهل جميع القيم "الخاطئة" باستثناء null وعدم التعريف (undefined). 0، ""، false — كل هذه تعتبر قيمًا صالحة وسيتم إرجاعها.

\n\n

مثال:

\n
$count = 0;\n$result = $count ?? 10;\necho $result; // سيطبع 0! لأن المتغير موجود وليس null.
\n\n

أترى الفرق؟ هذه هي الآلية الرئيسية "تحت الغطاء".

\n\n

3. مقارنة "تحت الغطاء": جدول الحقيقة

\n\n

دعنا نلخص كل شيء في جدول توضيحي لتثبيت المعلومة. لنفترض أن لدي

المدونات

توصيات الكتب