أولوية العوامل في PHP

من موسوعة حسوب
< PHP

المقصود بأولوية العوامل هو تحديد مدى "قوة" ربط العامل لتعبيرين مع بعضهما البعض. فعلى سبيل المثال في التعبير: 1‎ + 5 * 3 يكون الجواب 16 وليس 18 لأن لعامل الضرب (*) الأولوية على عامل الجمع (+). يمكن استخدام الأقواس لتحديد الأولوية حسب الحاجة. فمثلًا: ناتج التعبير ‎(1 + 5) * 3 هو 18.

عندما تتساوى العوامل في أولويتها فإن الخاصية التجميعية (associativity) هي التي تحدد كيفية تجميع العوامل. فمثلًا خاصية التجميع للعامل "-" يسارية، لذا فإن التعبير ‎1 - 2 - 3 يصبح ‎(1 - 2) - 3 ويكون الناتج ‎-4، أما العامل "=" فخاصية تجميعه يمينية، لذا يجمع التعبير ‎$a = $b = $c بالشكل التالي: ‎$a = ($b = $c)‎.

لا يمكن استخدام العوامل جنبًا إلى جنب عندما تمتلك أولوية متساوية ولا تمتلك خاصية تجميعية، فمثلًا التعبير 1 < 2 > 1 هو تعبير غير مقبول في PHP، أما التعبير ‎1 <= 1 == 1 يعدّ تعبيرًا صحيحًا، لأنّ العامل "==" يمتلك أولوية أدنى من العامل ‎<=‎ .

قد يؤدي استخدام الأقواس -حتى عند انعدام الحاجة إليها- إلى زيادة مقروئية الشيفرة وذلك بتحديد المجموعات بشكل واضح بدلًا من الاعتماد على أولوية العوامل وخواصها التجميعية المضمنة.

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

الخاصية التجميعية العامل معلومات إضافية
غير تجميعية clone new clone و new
يسارية ‎[‎ array()‎
يمينية ** عوامل حسابية
يمينية ‎++ -- ~ (int) (float) (string) (array) (object) (bool) @‎ عوامل الأنواع وعوامل الزيادة والنقصان
غير تجميعية instanceof عوامل الانواع
يمينية ! العوامل المنطقية
يسارية * / % العوامل الحسابية
يسارية + - . العوامل الحسابية وعوامل السلاسل النصية
يسارية << >> عوامل الأعداد الثنائية
غير تجميعية ‎‎< <= > >=‎ عوامل المقارنة
يسارية & عوامل الأعداد الثنائية والمراجع
يسارية ^ عوامل الأعداد الثنائية
يسارية | عوامل الأعداد الثنائية
يسارية && العوامل المنطقية
يسارية || العوامل المنطقية
يمينية ?? عوامل المقارنة
يسارية ? : عامل ثلاثي
يمينية ‎‎= += -= *= **= /= .= %= &= |= ^= <<= >>=‎ عوامل الإسناد
يسارية and العوامل المنطقية
يسارية xor العوامل المنطقية
يسارية or العوامل المنطقية

المثال 1: الخاصية التجميعية

<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// الخاصية التجميعية للعامل الثلاثي مختلفة عن لغتي سي و سي بلس بلس.
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>

تحدّد أولوية العوامل والخواص التجميعية طريقة تجميع التعابير مع بعضها بعضًا فقط، ولا تعيّن الترتيب المتّبع في معالجتها، إذ لا تحدّد PHP (في الحالات العامة) الترتيب المتّبع في معالجة تعبير معين، ولا تدعو إلى تجنّب طريقة معيّنة في المعالجة؛ وذلك بسبب الاختلافات التي قد تحصل فيما بين الإصدارات المتعددة للغة PHP وكذلك السياق الذي تظهر فيه هذه العوامل.

المثال 2: ترتيب غير معرّف للمعالجة

<?php
$a = 1;
// قد يطبع 2 أو 3
echo $a + $a++;

$i = 1;
// قد يعين الفهرس 1 أو 2
$array[$i] = $i++;
?>

المثال 3: العوامل + و - و . تمتلك الأولوية ذاتها

<?php
$x = 4;
// قد يعطي هذا السطر نتائج غير متوقعة
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// لأنه سيعالج مثل السطر التالي
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// يمكن فرض الأولوية المطلوبة باستخدام الأقواس
echo "x minus one equals " . ($x-1) . ", or so I hope\n";
?>

مخرجات المثال السابق هي:

-1, or so I hope
-1, or so I hope
x minus one equals 3, or so I hope

ملاحظة: على الرغم من امتلاك العامل = أولوية أدنى من غالبية العوامل، إلا أنّ PHP تسمح باستخدام تعابير مشابهة للتعبير: if (!$a = foo())‎ إذ تسند القيمة المعادة من الدالة foo()‎ إلى المتغير ‎$a.

مصادر