انتقل إلى محتوى الدرس
الدرس 20
دورة PHP

معاملات المقارنة والمنطق والدمج الفارغ وأولويات التنفيذ في PHPPHP Comparison Logical Operators and Operator Precedence

أتقن معاملات المقارنة الصارمة والمرنة، ومعامل السفينة الفضائية، والمعاملات المنطقية، ودمج الفارغ، وجدول أولويات المعاملات في PHP 8.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

يفحص التطابق الصارم (=== و!==) تطابق نوع البيانات والقيمة معاً، بينما تقوم المساواة المرنة (== و!=) بتحويل الأنواع تلقائياً قبل المقارنة.

  • مع التطابق الصارم، نتيجة 42 === "42" هي false ونتيجة 0 === false هي false.
  • في PHP 8.0+، تم إصلاح المقارنة المرنة 0 == "non-numeric" لتُرجع false بعد أن كانت true في PHP 7.
  • اجعل استخدام === و!== القاعدة الدائمة في جميع مقارنات كود PHP الخاص بك.

المقارنة 42 === "42" تُرجع false لاختلاف النوع بين رقم ونص، وفي PHP 8 تُرجع 0 == "hello" القيمة false.

مخطط توضيحي: محاكي معاملات المقارنة والمنطق وأولويات التنفيذ في PHP
PHP
<?php
var_dump(42 === 42);
var_dump(42 === "42");
var_dump(42 == "42");
var_dump(0 == "hello");
var_dump(0 === false);

إلى جانب معاملات المقارنة الترتيبية (< و> و<= و>=)، ينفذ معامل السفينة الفضائية <=> مقارنة ثلاثية الاتجاهات في تعبير واحد.

  • يُرجع التعبير $a <=> $b القيمة -1 عندما يكون الطرف الأيسر أصغر ($a < $b).
  • يُرجع التعبير $a <=> $b القيمة 0 عندما يتساوى الطرفان ($a == $b).
  • يُرجع التعبير $a <=> $b القيمة 1 عندما يكون الطرف الأيسر أكبر ($a > $b).

يُرجع معامل السفينة الفضائية -1 أو 0 أو 1 سواء مع الأعداد الصحيحة أو العشرية أو الترتيب الأبجدي للنصوص.

PHP
<?php
$lowVsHigh = 10 <=> 25;
$equalVals = 15 <=> 15;
$highVsLow = 90 <=> 40;
$strCompare = "apple" <=> "banana";

echo "10 <=> 25 : $lowVsHigh\n";
echo "15 <=> 15 : $equalVals\n";
echo "90 <=> 40 : $highVsLow\n";
echo "a <=> b   : $strCompare\n";

تدمج المعاملات المنطقية التعبيرات الشرطية أو تعكسها، وهي: && (معامل العطف المنطقي)، و|| (معامل التخيير المنطقي)، و! (النفي)، وxor (أو الحصرية).

  • تكون $a && $b صحيحة فقط إذا كان الطرفان صحيحين؛ وإذا كان الأول خاطئاً يتم تخطي الثاني (تقييم مختصر).
  • تكون $a || $b صحيحة إذا كان أحد الطرفين على الأقل صحيحاً؛ وإذا كان الأول صحيحاً يتم تخطي الثاني.
  • تكون $a xor $b صحيحة فقط عندما يكون أحد الطرفين صحيحاً والآخر خاطئاً (وتعطي false إذا كان الطرفان صحيحين معاً).

لأن كلاً من $hasCard و$hasWallet يساوي true، فإن ($hasCard xor $hasWallet) تعطي false، بينما ($hasCard xor $isBanned) تعطي true.

PHP
<?php
$hasCard = true;
$hasWallet = true;
$isBanned = false;

var_dump($hasCard && !$isBanned);
var_dump($hasCard || $hasWallet);
var_dump(($hasCard xor $hasWallet));
var_dump(($hasCard xor $isBanned));

من أشهر الفخاخ البرمجية في PHP أن المعاملات اللفظية (and وor وxor) أولويتها أضعف من معامل الإسناد =، بينما المعاملات الرمزية (&& و||) أولويتها أقوى من =!

  • في العبارة $res = true && false;، يحسب PHP نتيجة true && false أولاً فيُسند false للمتغير $res.
  • أما في العبارة $res = true and false;، ينفذ PHP الإسناد ($res = true) أولاً لأن = أقوى من and، فيظل $res مساوياً لـ true!
  • استخدم دائماً المعاملات الرمزية && و|| وتجنب المعاملات اللفظية and وor.

بدون أقواس، تقوم العبارة $withWordAnd = true and false بإسناد true للمتغير أولاً قبل النظر إلى and false!

مخطط تدفق التنفيذ العملي لقسم فخ الأولوية بين && و and وبين || و or في لغة PHP
PHP
<?php
$withSymbols = true && false;
$withWordAnd = true and false;
$wrappedWord = (true and false);

var_dump($withSymbols);
var_dump($withWordAnd);
var_dump($wrappedWord);

استخدم المعامل الثلاثي $cond ? $a : $b للاختيار الشرطي المباشر، ومعامل إلفيس ?: للقيم الحقيقية، ومعامل دمج الفارغ ?? و??= للقيم الافتراضية الآمنة.

  • المعامل الثلاثي المختصر $val ?: "Fallback" يُرجع $val إذا كان صحيحاً منطقياً، أو البديل إذا كان فارغاً أو صفرياً (بما في ذلك 0 و"").
  • معامل دمج الفارغ $val ?? "Fallback" يحتفظ بالقيم 0 و"" وfalse ولا يلجأ للبديل إلا إذا كان المتغير غير معرّف أو null.
  • معامل إسناد الفارغ $theme ??= "dark"; يسند القيمة "dark" فقط إذا كان $theme غير معرّف أو null.

لأن الصفر 0 قيمة خاطئة منطقياً، يستبدله المعامل 0 ?: 10 بالقيمة 10، بينما يحافظ المعامل 0 ?? 10 على الصفر لأنه لا يساوي null.

PHP
<?php
$zeroQty = 0;
$elvisResult = $zeroQty ?: 10;
$coalesceResult = $zeroQty ?? 10;

$timezone = null;
$timezone ??= "Asia/Riyadh";

echo "Elvis on 0: $elvisResult | ?? on 0: $coalesceResult\n";
echo "Timezone: $timezone\n";

تحدد أولويات المعاملات أي جزء من التعبير المركب ينفذه مفسر PHP أولاً عند عدم وجود أقواس.

  • معامل الأسس ** والنفي المنطقي ! لهما أولوية أعلى من الضرب * والقسمة / وباقي القسمة %.
  • معاملات المقارنة (< و=== و<=>) تُنفذ قبل &&، الذي يُنفذ قبل ||، الذي يُنفذ قبل ??.
  • في PHP 8.0+، تداخل المعاملات الثلاثية ? : بدون أقواس يطلق خطأً قاتلاً؛ لذا استخدم الأقواس الصريحة دائماً!

يُحسب الأس 2 ** 2 (4) أولاً ثم الضرب 5 * 4 (20) ثم الجمع (30)؛ ولأن && أقوى من || تُقيّم العبارة كـ (false && false) || true.

الأولوية (من الأعلى للأدنى)المعاملاتاتجاه التجميعالقاعدة الأهم
1 (Highest)**RightExponentiation runs before unary/math
2!, (int), ++RightLogical NOT and type casts
3*, /, %LeftMultiplication, division, modulo
4+, -LeftAddition and subtraction
5<, <=, >, >=Non-assocRelational comparisons
6==, !=, ===, !==, <=>Non-assocEquality and spaceship
7&& then || then ??Left / Right&& binds tighter than ||
8? : then =, ??=Non-assoc / RightAssignment happens after && / ||
9 (Lowest)and, xor, orLeftWord operators bind WEAKER than =!
PHP
<?php
$calc = 10 + 5 * 2 ** 2;
$logic = false && false || true;
$explicit = false && (false || true);

echo "Calc: $calc\n";
var_dump($logic, $explicit);
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

تحدد أولويات المعاملات أي جزء من التعبير المركب ينفذه مفسر PHP أولاً عند عدم وجود أقواس. معامل الأسس ** والنفي المنطقي ! لهما أولوية أعلى من الضرب * والقسمة / وباقي القسمة %. معاملات المقارنة (< و=== و<=>) تُنفذ قبل &&، الذي يُنفذ قبل ||، الذي يُنفذ قبل ??. في PHP 8.0+، تداخل المعاملات الثلاثية ? : بدون أقواس يطلق خطأً قاتلاً؛ لذا استخدم الأقواس الصريحة دائماً!

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Comparison & Logic المقارنة والمنطق والأولويات
أتقن معاملات المقارنة الصارمة والمرنة، ومعامل السفينة الفضائية، والمعاملات المنطقية، ودمج الفارغ، وجدول أولويات المعاملات في PHP 8.
للمراجعة
02 Strict Identity vs Loose Equality Rules قواعد التطابق الصارم === مقابل المساواة المرنة ==
المفهوم الأساسي لقسم قواعد التطابق الصارم === مقابل المساواة المرنة == في لغة PHP الحديثة.
للمراجعة
03 Relational and Spaceship Comparisons المقارنات الترتيبية ومعامل السفينة الفضائية <=>
الصياغة البرمجية والتطبيق العملي المباشر لقسم المقارنات الترتيبية ومعامل السفينة الفضائية <=>.
للمراجعة
04 Logical AND OR XOR and NOT Operators المعاملات المنطقية && و || و xor و !
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم المعاملات المنطقية && و || و xor و !.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم قواعد التطابق الصارم === مقابل المساواة المرنة == للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم المقارنات الترتيبية ومعامل السفينة الفضائية <=> وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما نتيجة المقارنة المرنة 0 == "hello" في PHP 8.4 (مقارنةً بإصدار PHP 7 القديم)؟

أصلح الإصدار PHP 8.0 هذه المشكلة الشهيرة بحيث لم تعد النصوص غير الرقمية تتحول إلى صفر.

02

ما القيم الثلاث الممكنة التي يُرجعها معامل السفينة الفضائية ($a <=> $b)؟

يُرجع معامل السفينة الفضائية دائماً أحد الأعداد الصحيحة الثلاثة: -1 أو 0 أو 1.

03

لماذا تجعل العبارة $result = true and false; قيمة المتغير $result تساوي true؟

معامل الإسناد = أقوى أولوية من الكلمات and وor وxor، بينما الرمز && أقوى من =.

04

متى تكون نتيجة التعبير المنطقي ($a xor $b) مساوية لـ true؟

معامل الاختيار الحصري xor يشترط اختلاف القيمتين المنطقيتين ويعطي false إذا تطابقتا.

05

ما الفرق بين $count ?: 10 (معامل إلفيس) و $count ?? 10 (دمج الفارغ) عندما تكون $count = 0؟

يفحص ?: الصدق المنطقي، بينما يفحص ?? عدم كون القيمة null فقط.

06

ماذا تفعل تعليمة إسناد دمج الفارغ $role ??= "guest";؟

التعليمة $role ??= "guest" هي اختصار مباشر لـ $role = $role ?? "guest".

07

في التعبير المنطقي false && false || true، لماذا تكون النتيجة النهائية true؟

معامل الربط && يرتبط دائماً بأولوية أقوى من معامل التخيير ||.

08

ماذا يحدث في PHP 8 عند كتابة معاملات ثلاثية متداخلة بدون أقواس: $a ? $b : $c ? $d : $e ؟

منع PHP 8.0 تداخل المعامل الثلاثي بدون أقواس لمنع الأخطاء المنطقية الناتجة عن التجميع اليساري القديم.