الوحدة الثانية: الثوابت وحالة الشرط والدوران

كتاب تعلم البرمجة بلغة PHP — إعداد: عبد اللطيف عايش وأحمد أبو السعود

الثوابت

يتم تعريف الثوابت باستخدام الكلمة المحجوزة const قبل اسم الثابت، أو من خلال الدالة define. ويتبع اسم الثابت قواعد كتابة اسم المتغير ذاته، غير أنه لا يبدأ بالعلامة $، ويُفضَّل أن يُكتب بالأحرف الكبيرة. ويجب أن يُعطى الثابت قيمة عند عملية تعريفه، ولا يمكن تغيير هذه القيمة فيما بعد.

<?php
const AHMAD = "user1";
const AAA = 'user1';
define("BBB","user2");
echo AHMAD.AAA.BBB;
?>

حالة الشرط (if)

وهي أنه في حالة تحقق الشرط يتم تنفيذ الأمر، وإلا لا يتم تنفيذ الأمر ولا الشرط في النهاية؛ أي أن الشرط في النهاية إما أن يكون محقَّقاً (true) أو غير محقَّق (false).

ملاحظة: في حالة تحقّق شرط جملة واحدة وعدم وجود أقواس، يتم تنفيذ الأمر البرمجي وصولاً لنهاية الأمر البرمجي المنتهي بالفاصلة المنقوطة (;).

<?php
if(true)
    echo "true<br>";

if(true)
{
    echo "<h1>true</h1>";
    echo "<h1>inside if</h1>";
}

if(false) echo "false<br>";

if(false)
    echo "<h2>false</h2>";

echo "outside if";
?>

وتكون حالة الشرط المتعددة (if / else if / else) على الصورة التالية، مثال عملي على حالة id لصفحة مختلفة:

<?php
$id = 200;
if($id == 100)
{
    echo "<h3><a href='page1.php'> go page1 </a></h3>";
}
else if($id == 200)
{
    echo "<h3><a href='page2.php'> go page2 </a></h3>";
}
else if($id == 400)
{
    echo "<h3><a href='page3.php'> go page3 </a></h3>";
}
else
{
    echo "<h3><a href='index.php'> go home </a></h3>";
}
?>

ولا يشترط كتابة جملة مفردة في النهاية، وأيضاً يمكن الاستغناء عن أقواس المجموعة إذا كان لدينا جملة واحدة داخل المجموعة. ملاحظة: أي عدد فلخف الصفر يعبر عن القيمة true، وأن أي سلسلة نصية فلخب السلسلة النصية الفارغة هي أيضاً true.

الحالة المختصرة (Ternary Operator)

حيث يتم وضع الشرط المُراد التحقق من صحته، ويليه علامة الاستفهام، ويعدها تعريف الكود الواجب تنفيذه إذا كان الشرط محقَّقاً، ثم يفصل بينهما الرمز : والكود اللازم تنفيذه إذا كان غير محقَّق: condition ? true : false;

<?php
echo true?"yes":"no";
?>

العمليات المنطقية

يمكن استخدام مختلف إشارات العمليات المنطقية في حلقات الشرط، وهي and أو && التي تعني "و"، وor أو || التي تعني "أو"، والإشارة ! التي تفيد النفي، والعملية المنطقية xor.

الشرطالحالة
$a and $b / $a && $bيكون true إذا كان كل من $a و $b يساوي true.
$a or $b / $a || $bيكون true إذا كان أي من $a أو $b يساوي true.
!$aيكون true في حالة $a يساوي false، ويكون false في حالة $a يساوي true.
$a xor $bيكون true إذا كان أي من $a أو $b يساوي true لكن ليسا متشابهين.

ملاحظة: يمكنك استخدام أي صيغة لعمليتي "and" و"or"، حيث الطريقتان متكافئتان، ولا يؤثر استخدام "and" أو "&&" أبداً.

<?php
echo "AND && <br>true and true = ";
if(true and true) echo "true<br>"; else echo "false<br>";

echo "true or false = ";
if(true or false) echo "true<br>"; else echo "false<br>";

echo "true xor true = ";
if(true xor true) echo "true<br>"; else echo "false<br>";

echo "!true = ";
if(!true) echo "true<br>"; else echo "false<br>";
?>

عمليات المقارنة

المعاملالوظيفة
==يساوي
!=لا يساوي
>أكبر من
<أصغر من
>=أكبر من أو يساوي
<=أصغر من أو يساوي
===مساواة القيم من نفس النوع
!==عدم مساواة القيم من نفس النوع

كما عرفنا في الأعلى أن الصفر يساوي القيمة false، وأي عدد فلخف الصفر يساوي true، وقيمة السلسلة النصية الفارغة مساوية للقيمة false، فلهذا لا يصلح أن نستخدم قيم المساواة العادية إذا أردت أن تختبر القيمة على أنها false فقط، ولا تصلح إلا إذا استخدمت عملية المساواة من نفس النوع (===).

<?php
if('10user1' == 10)
    echo "10user1 == 10 yes<br>";
else
    echo "10user1 == 10 no<br>";

if(0 == false)
    echo "0 == false yes<br>";
else
    echo "0 == false no<br>";

// بعد استخدام مساواة من نفس النوع (===)
if('10user1' === 10)
    echo "10user1 === 10 yes<br>";
else
    echo "10user1 === 10 no<br>";
?>

حالة switch/case

يمكن عمل نفس عمل مثال if/else السابق باستخدام جملة switch/case كالتالي، حيث أن جملة break هي للخروج بعد تنفيذ الأمر:

<?php
$id = 250;
switch($id)
{
    case 100:
        echo "<h3><a href='page1.php'> go page1 </a></h3>";
        break;
    case 200:
        echo "<h3><a href='page3.php'> go page3 </a></h3>";
        break;
    case 300:
        echo "<h3><a href='page4.php'> go page4 </a></h3>";
        break;
    default:
        echo "<h3><a href='index.php'> go home </a></h3>";
}
?>

الدالتان defined و isset

  • defined: دالة للتعرف على الثابت هل هو موجود أم لا وتعيد القيمة true في حالة وجوده، وتعيد القيمة false إن لم يكن موجوداً.
  • isset: دالة للتعرف على المتغير هل هو موجود ومسند له قيمة أم لا وتعيد القيمة true في حالة وجود المتغير وجود قيمة مسندة له، وتعيد القيمة false في حالة عدم وجود المتغير أو عدم وجود قيمة مسندة له، أو أن تكون القيمة المسندة للمتغير هي القيمة الفارغة null.
<?php
define("AAA","Mostaf ");
const BBB = "Khaled ";
$var1;
$var2 = null;
$var3 = '';

if(defined("AAA")) echo AAA;
if(defined("BBB")) echo BBB;
if(defined("CCC")) echo CCC;

if(isset($var1)) echo '<br>$var1 is set';
if(isset($var2)) echo '<br>$var2 is set';
if(isset($var3)) echo '<br>$var3 is set';
if(isset($var4)) echo '<br>$var4 is set';
?>

حلقات التكرار

حلقة الدوران for: الشكل العام لها: بداية الحلقة، شرط التوقف، معامل الزيادة أو النقصان، ثم الكود البرمجي المراد تكراره عدداً من المرات.

<?php
for($i=0; $i<10; $i++)
{
    echo '<h3>$i='.$i.'</h3>';
}

// أو بهذا الشكل إذا كانت تعليمة واحدة:
for($i=0; $i<10; ++$i) echo '<h3>$i='.$i.'</h3>';
?>

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

<?php
$count = 1;
while($count <= 10)
{
    echo "<h3> Hi </h3>";
    $count++;
}

while(true)
{
    echo "<h3> YES </h3>";
    if($count++ == 20) break;
}
?>

حلقة الدوران do-while: وهي نفس حلقة الدوران while لكن الفرق عنها أنها تنفذ دوران واحد قبل اختبار تحقق الشرط.

<?php
do
{
    echo "<h3>Hi</h3>";
}while(false);

$count = 0;
do
{
    echo '<h3>$count = '.++$count.'</h3>';
}while($count < 10);
?>

continue و break

في كل حلقات التكرار السابقة يمكن استخدام continue لتخطي حلقة أو دورة والانتقال للتي تليها، أو break للخروج من الحلقة نهائياً.

<?php
// continue: لتخطي دورة معينة والانتقال للتي تليها
for($i=0; $i<10; $i++)
{
    if($i == 5) continue;
    echo '<h3>$i='.$i.'</h3>';
}

// break: للخروج من الحلقة نهائياً
for($i=0; $i<10; ++$i)
{
    if($i == 5) break;
    echo '<h3>$i='.$i.'</h3>';
}
?>

الصيغة البديلة (بدون أقواس)

هناك صيغ أخرى لاستخدامها مع الأوامر البرمجية كـ if وfor وwhile وswitch بدلاً من الأقواس، وصيغها العامة لها كالتالي:

<?php
if(/* الشرط */):
    // أي عدد من الأوامر البرمجية
elseif(/* الشرط */):
    // أي عدد من الأوامر البرمجية
endif;

while(/* الشرط */):
    // الأوامر المراد تكرارها
endwhile;

for(/* أوامر الحلقة */):
    // الأوامر المراد تكرارها
endfor;

switch(/* القيمة */):
    case "":
        // ...
        break;
    default:
        //...
endswitch;
?>

مسرد المصطلحات

اضغط على كل بطاقة لعرض تعريف المصطلح.

const / define
طريقتان لتعريف ثابت في PHP؛ قيمته لا يمكن تغييرها بعد التعريف.
Ternary Operator (?:)
صيغة مختصرة لحالة الشرط: شرط ? قيمة عند التحقق : قيمة عند عدم التحقق.
&& / and
عملية منطقية "و"؛ تكون true فقط إذا كان الطرفان صحيحين.
|| / or
عملية منطقية "أو"؛ تكون true إذا كان أحد الطرفين صحيحاً.
== vs ===
== تقارن القيمة فقط، بينما === تقارن القيمة والنوع معاً.
switch/case
بنية شرطية بديلة عن سلسلة طويلة من else if، تقارن قيمة واحدة بعدة حالات.
isset()
دالة تتحقق من وجود متغير ووجود قيمة غير فارغة مسندة له.
defined()
دالة تتحقق من وجود ثابت معرّف مسبقاً.
continue
كلمة محجوزة لتخطي دورة معينة من حلقة تكرار والانتقال للتي تليها.
break
كلمة محجوزة للخروج نهائياً من حلقة تكرار أو من جملة switch.

10 مصطلحات أساسية لهذه الوحدة.

اختبار الوحدة

يتكوّن الاختبار من 5 أسئلة صح/خطأ، و5 أسئلة اختيار من متعدد، و3 أسئلة إنشائية. تُصحَّح الأسئلة الموضوعية تلقائياً، بينما تعرض الأسئلة الإنشائية إجابة نموذجية لتقييم إجابتك بنفسك.

أولاً: صح أم خطأ

1. يمكن تعريف ثابت في PHP باستخدام const أو الدالة define.

2. يمكن تغيير قيمة الثابت بعد تعريفه في أي مكان بالكود.

3. عملية المقارنة === تتحقق من تساوي القيمة والنوع معاً.

4. حلقة do-while تختبر الشرط قبل تنفيذ أي دورة من الحلقة.

5. الدالة isset تعيد false إذا كانت القيمة المسندة للمتغير هي null.

ثانياً: اختيار من متعدد

6. أي رمز يُستخدم للخروج من جملة switch بعد تنفيذ حالة (case) معينة؟

7. ما الفرق العملي بين continue و break داخل حلقة تكرار؟

8. الصيغة condition ? true : false تُعرف باسم:

9. أي عملية منطقية تُرجع true فقط إذا كان أحد الطرفين true دون الآخر (ليسا متشابهين)؟

10. الدالة المستخدمة للتحقق من وجود ثابت معرّف مسبقاً هي:

ثالثاً: أسئلة إنشائية

11. اكتب حلقة for تطبع الأعداد من 1 إلى 5 فقط.

<?php for($i=1; $i<=5; $i++) { echo $i.'<br>'; } ?>

12. حوّل مثال if/else if/else التالي إلى switch/case: التحقق من قيمة $id مساوية 100 أو 200 أو غير ذلك.

<?php switch($id) { case 100: echo "page1"; break; case 200: echo "page2"; break; default: echo "home"; } ?>

13. لماذا نستخدم عملية المقارنة === بدلاً من == عند التحقق من أن قيمة ما تساوي false بالتحديد؟

لأن == تعتبر الصفر والسلسلة النصية الفارغة وnull جميعها مساوية لـ false رغم اختلاف أنواعها، بينما === تتحقق من النوع والقيمة معاً، فتفرّق بدقة بين false الحقيقية وبين قيم أخرى تُقيَّم كـ false ضمنياً.