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

عامل الدمج مع null في PHP: ?? و??=

يعيد عامل الدمج مع null في PHP طرفه الأيسر ما لم يكن null أو غير معيَّن: $name = $_GET['name'] ?? 'Guest';. ولا يحذّر أبدًا من متغير أو مفتاح مصفوفة مفقود. تعلّم سلاسل ?? والإسناد ??= والفرق بين ?? و?: وعامل nullsafe ?->.

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

يعيد ?? القيمة الموجودة على يساره إذا كانت موجودة وليست null، وإلا القيمة على يمينه: $name = $_GET['name'] ?? 'Guest';. وبخلاف قراءة المفتاح مباشرة، لا يحذّر أبدًا عندما يكون المتغير أو مفتاح المصفوفة مفقودًا.

في التشغيل الأول لا توجد سلسلة استعلام، فتُستخدم القيمتان الافتراضيتان. انقر رابطًا في تبويب Page فيُنفَّذ السكربت مرة أخرى مع امتلاء $_GET. وقراءة $_GET["name"] دون ?? في ذلك التشغيل الأول كانت ستطبع Warning: Undefined array key "name" في إعداد PHP عادي. والمزيد عن بيانات الطلب في صفحة GETو_GET و_POST.

?? فحص isset() مختصر

$a ?? $b تعني بالضبط isset($a) ? $a : $b. يعمل على المتغيرات، ومفاتيح المصفوفات بأي عمق، وخصائص الكائنات، ويتوقف عند أول جزء مفقود دون اعتراض.

الفحص هو نفسه الذي تجريه isset، لذا فالمفتاح الموجود بالقيمة null يأخذ القيمة الافتراضية أيضًا.

سلسلة ?? لتجربة عدة مصادر

?? تجميعي من اليمين، ويمكنك ربط ما شئت منه في سلسلة. تعيد PHP أول معامل معيَّن وليس null.

??= لا يُسند إلا عند null

يخزّن $a ??= $b القيمة $b في $a فقط عندما تكون $a غير معيَّنة أو null. وهو أقصر طريقة لملء القيم الافتراضية أو لحساب شيء مرة واحدة وإعادة استخدامه.

لا يُقيَّم الطرف الأيمن من ??= إلا عندما يحدث الإسناد، ولهذا يظهر computing 4 مرة واحدة.

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

يختبر ?? القيمة null. ويختبر ?: الصحة المنطقية. ومع قيم مثل 0 و"" و"0" يعطيان إجابات مختلفة:

الكمية "0" مدخل حقيقي: يحتفظ بها ??، ويستبدلها ?:. وكان ?: وحده سيحذّر من المفتاح المفقود، ولهذا يغلّفه المثال هكذا ($inputs[$key] ?? null) ?: .... تشرح صفحة العامل الثلاثي العامل ?: نفسه.

عامل nullsafe ?->

?-> هو نسخة الكائنات من الفكرة نفسها، وأُضيف في PHP 8. إذا كان الكائن على اليسار null، تتوقف السلسلة كلها وتعيد null بدلًا من إطلاق Error مثل Call to a member function getAddress() on null. ضع ?? في النهاية للحصول على قيمة افتراضية.

المستخدم 2 موجود لكن ليس له عنوان، والمستخدم 3 غير موجود أصلًا. كلاهما يصل إلى القيمة الافتراضية ?? "unknown" دون خطأ.

خطأ شائع: أولوية ?? منخفضة

يرتبط ?? بقوة أقل من . والعوامل الحسابية. لذا في "Count: " . $count ?? 0، تبني PHP أولًا النص "Count: " . $count، الذي لا يكون null أبدًا، فلا تُستخدم القيمة الافتراضية أبدًا.

ضع تعبير ?? بين أقواس كلما كان داخل تعبير أكبر.

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

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

?? هو عامل الدمج مع null. يعيد $a ?? $b القيمة $a إذا كانت موجودة وليست null، وإلا $b. وهو اختصار لـ isset($a) ? $a : $b ولا يطلق تحذيرًا عندما تكون $a أو مفتاح المصفوفة غير معرّف.

ما الفرق بين ?? و?: في PHP؟

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

ماذا يفعل ??= في PHP؟

يُسند $a ??= $b القيمة $b إلى $a فقط إذا كانت $a تساوي null أو غير معيَّنة، وإلا يتركها كما هي. وهو اختصار لـ $a = $a ?? $b; وأُضيف في PHP 7.4.

ما عامل nullsafe ?-> في PHP؟

يستدعي $obj?->method() الدالة التابعة فقط عندما لا تكون $obj مساوية لـ null، وإذا كانت null تعيد السلسلة كلها null بدلًا من إطلاق خطأ. اجمعه مع ?? للحصول على قيمة افتراضية: $user?->getAddress()?->city ?? 'unknown'. وأُضيف في PHP 8.0.

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

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

ابدأ الآن