التعابير في PHP

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

تعدّ التعابير إحدى الوحدات البنائية الأكثر أهمية في PHP، ففي هذه اللغة كل ما تكتبه تقريبًا هو عبارة عن تعبير، لذا فإن أبسط وأدقّ تعريف للتعابير هو: "كلّ ما يمتلك قيمة".

تعدّ الثوابت والمتغيرات أبسط أشكال التعابير، فعند كتابة ‎$a=5 فإننا نسند '5' إلى ‎$a. ومن الواضح أن '5' تمتلك القيمة 5، أو بعبارة أخرى فإن '5' هي تعبير قيمته 5. (في هذه الحالة '5' هو عدد صحيح ثابت).

بعد إجراء عملية الإسناد هذه فإن المتوقع هو أن تكون قيمة ‎$a هي 5 كذلك، وإذا كتبت بعد ذلك ‎$b=$a فستتوقع حينها أنّك ستحصل على نفس النتيجة فيما لو كتبت ‎$b=5. وبعبارة أخرى فإنّ ‎$a هو تعبير يمتلك القيمة 5 كذلك. وإن كانت الأمور على ما يرام، فإن هذا ما سيحدث بالضبط.

الدوالّ هي أمثلة أكثر تعقيداً عن التعابير، فعلى سبيل المثال لاحظ الدالة التالية.

<?php
function foo ()
{
    return 5;
}
?>

على فرض أنّك مطّلع على مفهوم الدوال (إن لم تكن كذلك راجع فصل الدوال) فإنّك ستفترض أن كتابة ‎$c=foo()‎ هو مشابه تمامًا لكتابة ‎$c=5 وأنت محقّ في ذلك. فالدوالّ هي تعابير تمتلك القيمة التي تعيدها الكلمة المحجوزة return. ولمّا كانت الدالة foo()‎ تعيد 5 فإن قيمة التعبير 'foo()‎' هي 5.

لا تعيد الدوال في العادة قيمًا ساكنة فقط، بل تعيد كذلك قيمًا تعتمد على حسابات معينة.

من المؤكد أنّ المتغيرات في PHP ليست مقتصرةً على الأعداد الصحيحة، إذ تدعم PHP أربعة أنواع من القيم الأوليّة: الأعداد الصحيحة (integer) والأعداد العشرية (float) والسلاسل النصية (string) والقيم المنطقية (boolean) (القيم الأوليّة هي القيم التي لا يمكن تجزئتها إلى قيم أصغر، بخلاف المصفوفات على سبيل المثال). تدعم PHP كذلك نوعين من القيم المركبة (غير الأوليّة) وهي المصفوفات (array) والكائنات (object)، ويمكن إسناد هذين النوعين إلى متغيرات أو إرجاع قيمتهما من دالة.

لا تقتصر PHP في تعاملها مع التعابير على هذا المقدار، بل تتعداه إلى ما هو أبعد، كما هو حال العديد من اللغات البرمجية الأخرى. PHP هي لغة تعبيرية التوجه (expression-oriented) بمعنى أنّ كل شيء تقريبًا في هذه اللغة هو تعبير. فمثلًا لاحظ المثال الذي طرحناه قبل قليل '‎$a=5'. من السهل هنا ملاحظة وجود قيمتين في عملية الإسناد هذه، وهما قيمة العدد الصحيح الثابت '5' وقيمة ‎$a والتي أصبحت 5 كذلك. ولكن هناك في الواقع قيمة أخرى ضمن عملية الإسناد هذه، وهي قيمة الإسناد نفسها.

إذ تعالج عملية الإسناد هنا القيمة المسندة، وهي في هذه الحالة 5. ويعني هذا من الناحية العملية أنّ '‎$a=5' هو تعبير ذو قيمة تساوي 5 بغض النظر عن الوظيفة التي تقوم بها. لذا، فإن كتابة تعبير مثل '‎$b = ($a = 5)‎' مطابق تمامًا للتعبير '‎$a = 5; $b = 5;‎' (الفاصلة المنقوطة تعني نهاية الجملة). ولمّا كان تفسير عملية الإسناد يجري من اليمين إلى اليسار، فيمكن أيضًا كتابة التعبير '‎$b = $a = 5'.

إنّ عمليتي الإضافة والطرح السابقتين واللاحقتين (pre- and post-increment and decrement) هما خير مثال على التوجه التعبيري في PHP. إذ إن من المألوف لدى مستخدمي PHP والعديد من لغات البرمجة استخدام التعبير variable++‎ و variable--‎. هذه العلامات هي معاملات الزيادة والنقصان. توجد في لغة PHP كما هو الحال في لغة C نوعان من الزيادة: السابقة واللاحقة. في كلا الحالتين يؤدي استخدام المعامل إلى زيادة قيمة المتغير والنتيجة النهائية بمقدار واحد (1). لكن الاختلاف يكمن في قيمة تعبير الزيادة، فالزيادة السابقة والتي تأخذ الصيغة '‎++$variable' تعمل على معالجة القيمة المضافة (تزيد PHP قيمة المتغير قبل قراءة قيمته، وهذا هو سبب تسمية التعبير بالزيادة السابقة)، أما الزيادة اللاحقة والتي تأخذ الصيغة '‎$variable++‎' فتعالج القيمة الأصلية للمتغير ‎$variable قبل إجراء الزيادة على القيمة (تزيد PHP قيمة المتغير بعد قراءة قيمته، وهذا هو سبب تسمية التعبير بالزيادة اللاحقة).

هناك نوع شائع جدًّا من التعابير وهو تعابير المقارنة. تُعالج هذه التعابير إلى إحدى القيمتين FALSE أو TRUE. تدعم PHP كذلك المعاملات < (أكبر من) و =< (أكبر من أو يساوي) و == (المساواة) و ‎‎!=‎ (عدم المساواة) و > (أصغر من) و => (أصغر من أو يساوي). كذلك تدعم اللغة مجموعة من معاملات المساواة الصارمة strict: === (مساواة في القيمة والنوع) و ‎!==‎ (عدم المساواة في القيمة أو النوع).

تستخدم هذه المعاملات بصورة شائعة في التعابير الشرطية مثل عبارة if.

تعابير إسناد المعاملات المدمجة هي آخر مثال سنتعامل معه هنا بخصوص التعابير.

أصبحت تعرف الآن بأنّك لو أردت زيادة قيمة ‎$a بمقدار 1 فيمكنك بكل بساطة كتابة '‎$a++‎' أو '‎++$a'. ولكن ماذا لو أردت إضافة عدد أكبر من 1، لنقل 3 على سبيل المثال؟ يمكنك كتابة التعبير '‎$a++‎' عدة مرات، ولكن من الواضح أنّ هذه الطريقة غير فعالة وغير مريحة. أفضل طريقة للتعبير هنا هي كتابة '‎$a = $a + 3'.

يعالج التعبير '‎$a + 3' إلى القيمة '‎$a' مضافًا إليها 3 ثم يعاد إسناد النتيجة إلى المتغير ‎$a، فتكون المحصلة زيادة قيمة ‎$a بمقدار 3.

يمكن في PHP -كما هو الحال في لغات أخرى مثل C- اختصار هذا التعبير والذي سيصبح أوضح وأسرع للفهم مع مرور الوقت. يمكن اختصار عملية إضافة 3 إلى القيمة الحالية للمتغير ‎$a بكتابة التعبير '‎$a += 3'. وهذا يعني بالضبط: "خذ قيمة المتغير ‎$a، أضف إليها 3، ثم أعد إسناد النتيجة إلى ‎$a". هذه الطريقة أقصر وأوضح، إضافة إلى أنّها تؤدي إلى اختصار الوقت اللازم لتنفيذ الشيفرة.

إن قيمة '‎$a +=3' -مثل قيمة الإسناد الاعتيادية- هي القيمة المسندة. لاحظ أنّها ليست 3 وإنما هي القيمة المدمجة والناتجة من إضافة ‎$a إلى 3 (هذه هي القيمة التي أسندت إلى ‎$a). يمكن استخدام أي معامل ثنائي المكان (two-place operator، أي يجري عملياته على قيمتين) في أسلوب الإسناد هذا، فيمكن مثلًا استخدام التعبير '‎$a-=5' (اطرح 4 من قيمة ‎$a الحالية)، أو '‎$b*=7' (اضرب قيمة ‎$b الحالية بالعدد 7).

هناك نوع من المعاملات قد يبدو غريبًا إن لم تكن قد شاهدته في لغات البرمجة الأخرى، وهو معامل الشرط الثلاثي (ternary conditional operator).

<?php
$first ? $second : $third
?>

إن كانت قيمة التعبير الداخلي الأول هي TRUE (ليست صفرًا)، يُعالج التعبير الداخلي الثاني، وسيكون هو النتيجة النهائية للتعبير الشرطي. أما إن كانت قيمة التعبير الداخلي الأول هي FALSE، يُعالج التعبير الداخلي الثالث وتكون هذه هي النتيجة النهائية.

سيساعدك المثال التالي على استيعاب الإضافة اللاحقة والسابقة خصوصًا والتعابير عمومًا بصورة أفضل.

<?php
function double($i)
{
    return $i*2;
}
/* إسناد القيمة 5 */
$b = $a = 5;
/* الإضافة اللاحقة وإسناد القيمة الأصلية */
$c = $a++;
$e = $d = ++$b;
/* الإضافة السابقة وإسناد القيمة المضافة */


$f = double($d++);

$g = double(++$e);

$h = $g += 10;
?>

في البداية أسندنا القيمة 5 إلى المتغيرين ‎$a و ‎$b، بعد ذلك استخدمنا الإضافة اللاحقة وأسندنا النتيجة إلى المتغير ‎$c. بعدها أسندنا إلى المتغير ‎$e المتغير ‎$d والإضافة السابقة للمتغير ‎$b، وفي هذه النقطة أصبح المتغيران ‎$d و ‎$e يحملان القيمة 6.

بعد ذلك أسندنا ضعف قيمة ‎$d قبل الزيادة إلى ‎$f وهي ‎2*6 = 12، وبعدها أسندنا ضعف قيمة المتغير ‎$e (والتي هي ‎2*7 = 14) بعد الزيادة إلى المتغير ‎$g. وفي السطر الأخير تزداد قيمة ‎$g بمقدار 10 وتنتهي بالقيمة 24. تسند قيمة الإسناد (24) إلى ‎$h، وتكون القيمة النهائية لهذا المتغير هي 24 أيضًا.

يمكن النظر إلى بعض التعابير على أنّها جمل، وفي مثل هذه الحالات تكون صيغة الجملة expr;‎، أي يكون التعبير متبوعًا بالفاصلة المنقوطة. في المثال: '‎$b = $a = 5' يعد '‎$a = 5' تعبيرًا صحيحًا، ولكنّه ليس جملة في حد ذاته. في حين أن '‎$b = $a = 5;‎' هو جملة صحيحة.

أمر أخير جدير بالذكر هو القيمة الحقيقية للتعابير. ستجد نفسك في كثير من الحالات غير مهتمٍّ بمعرفة القيمة المضبوطة للتعبير، بل ما يهمّك هو مجرّد معرفة كون القيمة TRUE أو FALSE.

هذان الثابتان حساسان لحالة الأحرف وهما القيمتان المنطقيتان (البوليانيتان) الوحيدتان، ويُحوّل التعبير إلى القيمة المنطقية عند الحاجة. راجع صفحة تحويل الأنواع للمزيد من المعلومات عن طريقة التحويل.

توفّر PHP دعمًا كاملًا وقويًا للتعابير، ولا يسعنا توثيق هذا الدعم بصورة كاملة في هذا الدليل، ولكن الأمثلة السابقة تقدّم فكرة جيدة حول ماهيّة التعابير وكيفية إنشاء تعابير مفيدة.

في الأجزاء التالية من هذا الدليل سنستخدم المختصر expr للإشارة إلى تعبير PHP صحيح.

مصادر