المشغلون

العوامل الحسابية هي اللبنات الأساسية للغة البرمجة — حيث تُستخدم لدمج المتغيرات والقيم من أجل إجراء العمليات الحسابية واتخاذ القرارات. تتميز العوامل الحسابية في لغة PHP بتنوعها وسهولة استخدامها، كما أن العديد منها مستمد مباشرة من الرموز الرياضية.

1. العوامل الحسابية

▶ مثال: جميع العوامل الحسابية

PHP
<?php
$a = 10;
$b = 3;

echo $a + $b;   // 13  Addition
echo $a - $b;   // 7   Subtraction
echo $a * $b;   // 30  Multiplication
echo $a / $b;   // 3.333...  Division (note: PHP division always returns a float)
echo $a % $b;   // 1   Modulus (remainder)
echo $a ** $b;  // 1000  Exponentiation (PHP 5.6+, 10 to the power of 3)

// Negation
echo -$a;       // -10  Negation
?>
▶ جرّب الكود

2. عوامل التعيين

التعيين الأساسي = بسيط ومباشر. أما ما يوفر الوقت حقًّا فهو عوامل التعيين المركب:

PHP
<?php
$x = 10;

$x += 5;   // $x = $x + 5;   → 15
$x -= 3;   // $x = $x - 3;   → 12
$x *= 2;   // $x = $x * 2;   → 24
$x /= 4;   // $x = $x / 4;   → 6
$x %= 4;   // $x = $x % 4;   → 2
$x .= " yuan"; // $x = $x . " yuan"; → "2 yuan" (string append assignment)
?>

3. عوامل المقارنة

يُستخدم لمقارنة قيمتين؛ والنتيجة هي true أو false:

PHP
<?php
$a = 5;
$b = "5";

// Loose comparison (== compares value only, auto-converts types)
var_dump($a == $b);    // bool(true)  — 5 equals "5"
var_dump($a != $b);    // bool(false)

// Strict comparison (=== compares both value and type)
var_dump($a === $b);   // bool(false) — 5 doesn't equal "5" (different types)
var_dump($a !== $b);   // bool(true)

// Greater / less than
var_dump($a > 3);      // bool(true)
var_dump($a >= 5);     // bool(true)
var_dump($a < 10);     // bool(true)
var_dump($a <= 5);     // bool(true)

// Spaceship operator (PHP 7+) <=>
// Returns -1 if left is smaller, 0 if equal, 1 if left is larger
echo 1 <=> 2;   // -1
echo 2 <=> 2;   // 0
echo 3 <=> 2;   // 1
// Commonly used in sorting callbacks
?>

(1) دليل اتخاذ القرار بين == و===

السيناريو الاستخدام السبب
التحقق من صحة بيانات الإدخال في النماذج === قد يُساء تفسير ما يدخله المستخدم "0" بواسطة ==
مقارنة قيم الإرجاع في قواعد البيانات === قد تُرجع قواعد البيانات الأرقام على شكل سلاسل نصية
المقارنة مع الثوابت === المقارنة الدقيقة
التحقق من قيمة الإرجاع لـ strpos() !== false قد يُفسر == false القيمة 0 تفسيرًا خاطئًا
مقارنة عددية بسيطة (كلا الطرفين أرقام بالتأكيد) == هذا يعمل، لكن === لا يضر أيضًا
💡 نصيحة: ما لم يكن لديك سبب واضح لاستخدام == (مقارنة غير دقيقة)، فاستخدم === (مقارنة دقيقة) كإعداد افتراضي. فهذا يمنع حدوث أخطاء لا حصر لها ناجمة عن التحويل الضمني للأنواع.

▶ مثال: المقارنة الدقيقة في الممارسة العملية

PHP
<?php
// In a search engine, a user might enter "0"
$search = "0";

// ❌ Wrong approach
if ($search == false) {
    echo "You didn't enter a search term"; // This runs! Because "0" == false
}

// ✅ Correct approach
if ($search === "") {
    echo "You didn't enter a search term"; // "0" !== "", won't misjudge
}
?>
▶ جرّب الكود

4. العوامل المنطقية

يُستخدم لربط شروط متعددة:

PHP
<?php
$age = 20;
$hasTicket = true;

// AND (both must be true)
var_dump($age >= 18 && $hasTicket);   // bool(true)
var_dump($age >= 18 and $hasTicket);  // bool(true) — lower precedence than &&

// OR (at least one must be true)
var_dump($age < 18 || $hasTicket);    // bool(true) — has a ticket, so can enter
var_dump($age < 18 or $hasTicket);    // bool(true) — lower precedence than ||

// NOT (negation)
var_dump(!$hasTicket);  // bool(false)
var_dump(!false);       // bool(true)

// XOR (true when the two are different)
var_dump(true xor false);  // bool(true)
var_dump(true xor true);   // bool(false)
?>
⚠️ تحذير: && وand يتصرفان بشكل مختلف! يؤدي $a = true && false; إلى false (&& له أولوية أعلى من =)، بينما يؤدي $a = true and false; إلى true (= له أولوية أعلى من and). استخدم دائمًا && و||، وليس and وor.


5. عوامل معالجة السلاسل

يحتوي لغة PHP على عاملين فقط للعمل على السلاسل:

المشغل الإجراء المثال النتيجة
. ربط "Hello" . " PHP" "Hello PHP"
.= إضافة $s = "A"; $s .= "B"; $s = "AB"
PHP
<?php
$name = "John";
echo "Hello, " . $name . "!";  // Hello, John!

$html = "<div>";
$html .= "<h1>Title</h1>";
$html .= "<p>Content</p>";
$html .= "</div>";
echo $html;
// <div><h1>Title</h1><p>Content</p></div>
?>

6. العامل الثلاثي (?:)

المُشغِّل الثلاثي هو اختصار لـ if...else:

▶ مثال: مقارنة بين الدمج الثلاثي والدمج مع القيمة الفارغة

PHP
<?php
$age = 20;

// Format: condition ? value_if_true : value_if_false
$status = ($age >= 18) ? "Adult" : "Minor";
echo $status;  // Adult

// The above is equivalent to:
if ($age >= 18) {
    $status = "Adult";
} else {
    $status = "Minor";
}

// PHP 5.3+ shorthand (omit the middle part)
$username = $_GET['name'] ?: "Guest";
// Equivalent to: use $_GET['name'] if it's truthy, otherwise "Guest"
?>
▶ جرّب الكود
💡 نصيحة: يُعدُّ المُشغِّل الثلاثي أداةً رائعةً لاتخاذ القرارات في سطر واحد. لكن لا تقم أبدًا بتداخل المُشغِّلات الثلاثية$a ? $b ? $c : $d : $e غير قابل للقراءة على الإطلاق.


7. عامل دمج القيم الفارغة (??)

هذه إحدى الميزات الأكثر فائدة التي أُضيفت في PHP 7:

PHP
<?php
// ?? operator: use the left side if it's not null, otherwise use the right side
$username = $_GET['user'] ?? "Anonymous";
// Equivalent to: isset($_GET['user']) ? $_GET['user'] : "Anonymous"

// ??= operator (PHP 7.4+): assign only if the left side is null
$config = null;
$config ??= "default";   // $config is now "default"

$config2 = "existing value";
$config2 ??= "default";  // $config2 is still "existing value" (not null, so no overwrite)

// The difference between ?? and ?: 
$name = "";
echo $name ?: "default";   // "default" (empty string is falsy)
echo $name ?? "default";   // "" (empty string is not null)
?>
المشغل المنطق كيفية معالجة ""
?: استخدم الجانب الأيمن إذا كان الجانب الأيسر «فالس» "" → استخدم الجانب الأيمن
?? استخدم الجانب الأيمن إذا كان الجانب الأيسر «null» أو «undefined» "" → استخدم الجانب الأيسر ("" ليس «null»)
💡 نصيحة: عند التعامل مع المدخلات التي يدخلها المستخدم، عادةً ما يكون ?? أكثر أمانًا من ?:، لأن المستخدم قد يقوم عمدًا بإدخال سلسلة فارغة ""، وهي مدخلة صالحة.


8. أولوية العمليات الحسابية

عندما يحتوي التعبير على عدة عوامل حسابية، تستخدم لغة PHP قواعد الأسبقية لتحديد أيها يجب تقييمه أولاً:

الأسبقية العوامل
عالي ** (الرفع إلى القوة)
!، ~، ++، --
*، /، %
+، -، .
<، <=، >، >=
==، !=، ===، !==
&&
`
??
?: (ثلاثي)
منخفض =، +=، .= ، إلخ.
PHP
<?php
// Don't memorize the table — use parentheses to clarify intent
$result = $a + $b * $c;        // Unclear
$result = $a + ($b * $c);      // Clear

// Same for complex conditions
if (($age >= 18 && $hasTicket) || $isVip) {
    echo "Entry allowed";
}
?>
💡 نصيحة: لست بحاجة إلى حفظ جدول أولوية العمليات الحسابية. عندما تكون في شك، استخدم الأقواس. الكود مكتوب للبشر؛ والأقواس تجعل مقصودك واضحًا على الفور.

❓ أسئلة شائعة

س متى بالضبط يجب عليّ استخدام == مقابل ===؟
ج استخدم === بشكل افتراضي. استخدم == فقط عندما تكون بحاجة فعلاً إلى التحويل التلقائي للأنواع (على سبيل المثال، عند مقارنة أرقام من مصادر مختلفة). بالنسبة لعمليات التحقق التي تستخدم strpos()، والمقارنات مع false/null، يجب عليك استخدام ===.
س كيف أختار بين ?? و?:؟
ج استخدم ?? عند استخراج القيم من GET/POST (فقد لا يرسل المستخدم المعلمة على الإطلاق). استخدم ?: عندما تهتم بما إذا كان المتغير يحتوي على «محتوى فعلي» (تُعتبر السلسلة الفارغة عدم وجود محتوى). استخدم ?? أيضًا للتحقق من وجود مفاتيح المصفوفة.
س لماذا ينتج عن 1 + "10 cats" الرقم 11 وليس 1؟
ج عندما يحول PHP سلسلة أحرف إلى رقم، فإنه يقرأها من البداية حتى يصل إلى أول حرف غير رقمي. تبدأ السلسلة "10 cats" بـ "10"، لذا يتم تحويلها إلى 10. أما إذا بدأت السلسلة بحرف غير رقمي (مثل "cats 10")، فيتم تحويلها إلى 0.

📖 ملخص

📝 تمارين

  1. أنشئ متغيرين يمثلان عمر المستخدم وحالة عضويته، ثم استخدم العوامل المنطقية لتحديد ما إذا كان بإمكانه الدخول (العمر ≥ 18 أو أنه عضو).
  2. استخدم العامل ?? لاسترداد معلمة URL page بأمان، مع القيمة الافتراضية 1؛ ثم استخدم العامل الثلاثي لعرض "الصفحة الرئيسية" إذا كانت الصفحة ≤ 1، أو "الصفحة N" في الحالات الأخرى.
  3. اكتب تمرينًا على العمليات المركبة: إذا كان سعر المنتج ونسبة الخصم معروفين، احسب السعر بعد الخصم وقم بتنسيق الناتج بحيث يظهر رقمان عشريان.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%