اذهب إلى المحتوى

السؤال

نشر

في بعض سكريبتات PHP أجد أنه تم إستخدام المعامل | بدلًا من المعامل || ، أعلم أن المعامل || يعني OR ويرجع True إذا كان أحد الطرفين Truthy، لكن عندما قمت بتجربة المعامل | وجدت أنه يعمل أيضًا بدون مشكلة:

<?php
 
 if (true | false) {
     echo "ok";	// ok
 }

لذلك كنت أتسأل عن الفرق بينهما، هل هو مجرد إختصار للكود أم أن هناك إختلاف بين المعاملين؟

Recommended Posts

  • 1
نشر

عملية المقارنة ( | ) هي عملية ثناية تتم على مستوى البت وتعرف بـ Bitwise Operation: بحيث يتم فيها المقارنة على مستوى البتات المكونة لكل من الطرفين بدلاً من القيم ككل:

print_r(1 | 2)  // 3 ناتج الطباعة

أما عملية المقارنة ( || ) فهي عملية منطقية تتم على مستوى نمط البيانات من نوع Boolean والتي تستخدم غالباً ضمن الجمل الشرطية وفي معظم الشيفرات البرمجية:

print_r(1 || 2) // 1 ناتج الطباعة

والفرق الأهم بين كل منهما هو أنه في عملية المقارنة المنطقية Boolean أو ( || ) يتم فيها التحقق من الشروط بدءً من اليسار، وفي حال تحقق شرط ما، يتم إهمال بقية الشروط. عكس الطريقة السابقة ( | ) حيث يتم فيها تنفيذ المقارنة الثنائية على جميع القيم (الشروط) الموجودة.

if(condition1 || condition2 || condition3)

//في حال تحقق الشرط الأول، سيتم التوقف عن تقييم بقية الشروط

if(condition1 | condition2 | condition3)

//سيتم تقييم جميع الشروط بغض النظر عن تحقق أي شرط منهم

وهذا الفرق ينطبق أيضاً على عمليات & و && بشكل مشابه، ولكن بشكل عام نادراً مانجد استخدام لعمليات المقارنة الأحادية (أي | و &) وسبب ذلك بسيط:

if(person != null && person.age < 18)

في هذا المثال سيتم أولاً التحقق من الشرط الأول (وهو أن القيمة person لاتساوي null)، وفي حال تحقق الشرط لن يتم إكمال التحقق من الشروط الأخرى وسيتم الخروج من الجملة الشرطية فوراً.

أما لو استخدمنا & بدلاً من && من الممكن أن نحصل على خطأ من نوع NullReferenceException وذلك لأننا نتحقق من خاصية age لمتغيّر غير موجود null.

لذلك يتم في أغلب الأحيان استعمال عمليات المقارنة المزدوجة && و || ما لم يكن هناك حاجة ضرورية في البرنامج لاستخدام العمليات الأحادية أو عند الحاجة للتعامل على مستوى البت كما رأينا في Bitwise Operation أو ضمن لغات البرمجة منخفضة المستوى والقريبة من لغة الآلة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...