بنية لغة PHP




التعرف على بنية لغة PHP

الجزء الثاني



سنكمل شرح النقاط التي كنا قد ذكرناها في الجزء الأول من المحاضرة.

عاشراً : استخدام التوابع (functions) :

تمتلك لغة  PHP  مكتبة من التوابع functions  التي تمكننا من التعامل مع المتغيرات واختبارها بطرق مختلفة.

·         فحص وضبط أنواع المتغيرات:

التوابع الأكثر استخداماً في هذا المجال هي : gettype ()  و  settype ()  ، وتستخدم على الشكل التالي:
string gettype(mixed var);
bool settype(mixed var, string type);

-          استخدام gettype () :
نقوم بتمرير متغير لهذا التابع من أي نوع ، فيقوم التابع بتحديد النوع و إرجاع النتيجة على شكل سلسلة تحتوي على اسم النوع أياً كان هذا النوع ، ويمكن أن تكون النتيجة   unknown type  إذا لم يكن المتغير ينتمي لأحد الأنواع المعروفة.
-          استخدام settype () :
يأخذ هذا التابع وسيطين : المتغير الذي نريد تغيير نوعه ،  و سلسلة تحتوي على النوع الجديد الذي نريده ، ويقوم بتغيير نوع المتغير إلى النوع الجديد.

مثال :
$a = 56;
echo gettype($a).'<br />';
settype($a, 'float');
            echo gettype($a).'<br />';


في هذا المثال عندما يتم استدعاء  gettype ()  في المرة الأولى ، يكون نوع $a عددًا صحيحًا لكن بعد استدعاء settype ()   يتم تغيير النوع ليصبح float  .
يوجد لدى  PHP  أيضًا بعض التوابع لاختبار النوع ، كل منها يأخذ متغير ما كوسيط ويعيد نتيجة منطقية إما صح أو خطأ ، وهذه التوابع هي:
-           is_array (): للتحقق فيما إذا كان المتغير عبارة عن مصفوفة أم لا.
-          is_double () , is_float () , is_real () : للتحقق فيما إذا كان المتغير عبارة عن عدد حقيقي أم لا.
-          is_long () , is_int () , is_integer () : للتحقق فيما إذا كان المتغير عبارة عن عدد صحيح أم لا .
-          is_string () : للتحقق فيما إذا كان المتغير سلسلة محرفية أم لا.
-          is_bool () : للتحقق فيما إذا كان المتغير منطقيًا أم لا .
-          is_object () : للتحقق فيما إذا كان المتغير كائنًا أم لا.
-          is_resource () : للتحقق من أن المتغير هو مورد أم لا.
-          is_null () : للتحقق فيما إذا كان المتغير فارغًا أم لا.
-          is_scalar () : للتحقق فيما إذا كان المتغير رقمًا قياسيًا ، أي عدد صحيح ، حقيقي ، منطقي ، سلسلة .
-          is_numeric () : للتحقق فيما إذا كان المتغير هو أي نوع من الأرقام أو سلسلة رقمية.
-          is_callable () : للتحقق فيما إذا كان المتغير هو اسم دالة صالحة.

·         اختبار حالة المتغيرات:

تمتلك لغة PHP عدة توابع لاختبار حالة المتغير.
-           isset ()  : وله الشكل التالي :
bool isset(mixed var[, mixed var[,...]])

حيث يأخذ هذا التابع اسم متغير ما كوسيط ويعيد نتيجة منطقية صح إذا كان المتغير موجود وخطأ فيما عدا ذلك ، كما يمكننا أيضًا تمرير قائمة متغيرات مفصولة بفواصل ، وعندها سيعيد التابع نتيجة صح إذا كانت جميع المتغيرات موجودة.
-          unset ()  : وله الشكل التالي :
void unset(mixed var[, mixed var[,...]])

حيث يقوم هذا التابع بالتخلص نهائياً من المتغير أو مجموعة المتغيرات التي تمرر لها ، ولا تعيد أي نتيجة.
-          empty() : وله الشكل التالي :
bool empty(mixed var)

حيث يقوم هذا التابع بالتحقق من المتغير فيما إذا كان موجودًا و لا يحوي القيمة صفر ، فإذا تحقق ذلك يعيد القيمة false أما إذا كان غير موجود أو يحوي القيمة صفر يعيد القيمة true .
لتطبيق ما سبق سنضيف الكود التالي إلى البرنامج النصي مؤقتًا:
echo 'isset($tireqty): '.isset($tireqty).'<br />';
echo 'isset($nothere): '.isset($nothere).'<br />';
echo 'empty($tireqty): '.empty($tireqty).'<br />';
echo 'empty($nothere): '.empty($nothere).'<br />';

لنقم بتحديث الصفحة لمشاهدة النتائج.
في السطر الأول التابع isset ()   سيعيد النتيجة 1 عند فحص المتغير  $tireqty  أي true  وذلك بغض النظر عن القيمة التي قمنا بإدخالها في حقل النموذج حتى ولو لم ندخل أي قيمة على الإطلاق ، المهم أنه يفحص وجود المتغير فقط ، أما نتيجة التابع empty() في السطر الثالث فتعتمد على القيمة التي تم إدخالها من قبل المستخدم لهذا المتغير هل هي صفر أم لا.
في السطر الثاني التابع isset ()   سيعيد النتيجة 0 عند فحص المتغير $nohere أي false لأن هذا المتغير غير موجود أصلاً ، أما نتيجة التابع empty() في السطر الرابع ستكون 1 أي true .

·         إعادة تفسير المتغيرات  :

يمكن أن نقوم بتغيير قيمة متغير ما من نمط ما إلى نمط آخر مناسب من خلال التوابع التالية:
int intval(mixed var[, int base=10])
float floatval(mixed var)
string strval(mixed var)

 كل تابع من التوابع السابقة يقبل متغير ما كوسيط له ويقوم بإعادة قيمة المتغير محولة إلى النمط المطلوب  كما يتيح لنا التابع  intval ()  أيضًا تحديد أساس التحويل.

الحادي عشر : التعامل مع القرارات باستخدام : if , else , switch :

نستطيع التحكم في تدفق تنفيذ البرنامج من خلال عبارات الشرط و الحلقات ، حيث يمكننا اعتماداّ على ما يدخله المستخدم مثلاً أن نأخذ مجموعة من القرارات و يكون البرنامج قادراً على القيام بها ، وسنرى ذلك الآن.

·         استخدام عبارات if :

يمكننا استخدام عبارة  if  من أجل اتخاذ قرار ما ، حيث يجب علينا وضع شرط معين وفي حال تحقق الشرط وكان صحيحاً يتم تنفيذ مجموعة من التعليمات البرمجية ، و إذا لم يتحقق هذا الشرط يتم تنفيذ مجموعة تعليمات أخرى و عبارة الشرط هذه يجب أن تكون محاطة بقوسين.
مثلاً في شركة بوب إذا لم يطلب المستخدم إطارات ، ولا زجاجات زيت ، ولا شمعات إشعال فهذا يعني أنه ضغط على زر submit عن طريق الخطأ قبل أن ينتهي من ملء النموذج ، وهنا بدلاً من إخبار المستخدم أنه "تمت معالجة الطلب" ، يمكن أن نقدم له رسالة أكثر فائدة تدل على أنه لم يقم بطلب شيء ، وذلك على الشكل التالي:
if ($totalqty == 0)
echo 'You did not order anything on the previous page!<br />';

لاحظ أن الشرط الذي نستخدمه هنا هو (  $totalqty == 0 ) الذي سيكون صحيحاً عندما لا يطلب المستخدم أي شيء وبالتالي سيتم تنفيذ عبارة الطباعة.

·         كتل العبارات البرمجية :

غالبًا ما يكون لدينا أكثر من عبارة واحدة نريد تنفيذها وفقًا لشرط ما ، لذا لا بد من  تجميع هذه العبارات ضمن كتلة واحدة ، يتم ذلك من خلال وضع هذه الكتلة  ضمن الأقواس المتعرجة  { }على الشكل التالي:
if ($totalqty == 0)
{
echo '<p style="color:red">';
echo 'You did not order anything on the previous page!';
echo '</p>';
}

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

·         استخدام عبارات else :

قد نحتاج غالبًا إلى أن نقوم بإجراء بديل أو مجموعة من الإجراءات البديلة في حال كان الشرط غير محقق  وهنا نحتاج إلى عبارة else  التي تسمح بتنفيذ هذه الإجراءات.
مثلاً في مثال شركة بوب إذا أردنا أن نقوم ببعض الإجراءات عندما يقوم الزبائن بملء طلباتهم فأننا نكتب:

if ($totalqty == 0)
{
 echo "You did not order anything on the previous page!<br />";
}
else
{
echo htmlspecialchars($tireqty).' tires<br />';
echo htmlspecialchars($oilqty).' bottles of oil<br />';
echo htmlspecialchars($sparkqty).' spark plugs<br />';
}

فعند عدم تحقق الشرط ينتقل البرنامج فوراً إلى العبارة else  ويقوم بتنفيذ العبارات الموجودة ضمن الأقواس المتعرجة الموجودة تحتها.
يمكننا أيضاً بناء عمليات منطقية أكثر تعقيدًا من خلال تداخل عبارات الشرط داخل بعضها البعض على الشكل التالي:
if ($totalqty == 0)
{
   echo "You did not order anything on the previous     page!<br />";
}
else
 {
   if ($tireqty > 0)
         echo htmlspecialchars($tireqty).'tires<br />';
   if ($oilqty > 0)
         echo htmlspecialchars($oilqty).'bottles of oil<br />';
   if ($sparkqty > 0)
     echo htmlspecialchars($sparkqty).'spark plugs<br />';
 }
في التعليمات السابقة سيتم عرض كل سطر فقط عند تحقق الشرط الخاص به.

·         استخدام عبارات elseif :

نستخدم هذه العبارات في الحالات التي يكون لدينا فيها أكثر من خيارين لاتخاذ قرار ما ، وهنا نحتاج إلى مزيج من عبارات if  و  else ، حيث يقوم البرنامج بالتحقق من كل من هذه العبارات حتى يجد واحدة صحيحة فيقوم بتنفيذها.
            مثلاً في برنامج شركة بوب ، توفر الشركة خصمًا على الطلبيات الكبيرة من الإطارات على الشكل التالي:
o       شراء أقل من 10 إطارات - بدون خصم.
o       عدد الإطارات المشتراة تتراوح ضمن المجال 10-49 – خصم 5%  .
o       عدد الإطارات المشتراة تتراوح ضمن المجال 50-99 – خصم 10% .
o       عدد الإطارات المشتراة 100 أو أكثر  -  خصم 15% .
يمكننا وضع كود لحساب هذا الخصم باستخدام الشروط وعبارات if و elseif على الشكل التالي:
if ($tireqty < 10) {
   $discount = 0;
 }
elseif (($tireqty >= 10) && ($tireqty <= 49)) {
   $discount = 5;
 }
elseif (($tireqty >= 50) && ($tireqty <= 99)) {
   $discount = 10;
 }
 elseif ($tireqty >= 100) {
   $discount = 15;
}

في المثال السابق يمكن أن نكتب عبارات  elseif بدون فراغ بينها أو if  و else مع وجود فراغ ، ويجب أن ننتبه عند كتابة عبارات متتالية من elseif أن واحدة فقط من الكتل سوف تتنفذ ، لأن البرنامج يبحث ضمن الشروط المكتوبة و أول شرط يتحقق يقوم البرنامج بتنفيذه.

·         استخدام عبارات switch :

تعمل عبارة switch بطريقة مماثلة لعبارة  if  ، لكنها تسمح للشرط بأن يأخذ أكثر من قيمتين.
في عبارة  if   يمكن أن يكون الشرط صحيحًا أو خاطئاً فقط بينما في عبارة switch  يمكن أن يأخذ الشرط أي عدد من القيم المختلفة .
 تحتاج عبارة switch  إلى عبارات case حتى تتعامل مع الحالات المختلفة الموجودة لدينا.
في مثال شركة بوب يريد بوب أن يعرف أشكال الإعلانات التي تعمل معه لذا يمكن أن نضيف سؤال إلى نموذج الطلب في صفحة HTML على الشكل التالي:
<tr>
<td>How did you find Bob's?</td>
<td><select name="find">
<option value = "a">I’m a regular customer</option>
<option value = "b">TV advertising</option>
<option value = "c">Phone directory</option>
<option value = "d">Word of mouth</option>
</select>
</td>
</tr>

وسيكون شكل الصفحة هو كالتالي :



حيث قمنا في صفحة  HTML بإضافة متغير جديد للنموذج هو  find  و ستكون قيمته "a"  أو  "b"  أو "c"  أو  "d"  ويمكننا التعامل مع هذا المتغير الجديد بسلسلة من عبارات  if  و  elseif  كالتالي:
if ($find == "a") {
    echo "<p>Regular customer.</p>";
} elseif ($find == "b") {
    echo "<p>Customer referred by TV advert.</p>";
} elseif ($find == "c") {
    echo "<p>Customer referred by phone directory.</p>";
} elseif ($find == "d") {
    echo "<p>Customer referred by word of mouth.</p>";
} else {
    echo "<p>We do not know how this customer found us.</p>";
}


ويمكننا بدلاً من ذلك أن نستخدم عبارات switch على الشكل التالي:
switch($find) {
case "a" :
   echo "<p>Regular customer.</p>";
   break;
case "b" :
   echo "<p>Customer referred by TV advert.</p>";
   break;
case "c" :
   echo "<p>Customer referred by phone directory.</p>";
   break;
case "d" :
   echo "<p>Customer referred by word of mouth.</p>";
   break;
default :
   echo "<p>We do not know how this customer found us.</p>";
   break;
}

تتصرف عبارة switch إلى حد ما بشكل مختلف عن عبارة  if  و  elseif .
فعبارة if   تؤثر فقط على عبارة واحدة تحتها إلا إذا وضعنا الأقواس المتعرجة لتنفيذ كتلة من العبارات ، أما بالنسبة لعبارة switch فعندما يصل PHP إلى عبارة case ينفذ كل العبارات الموجودة تحتها حتى يصل إلى عبارة break  عندها ينتقل البرنامج إلى السطر الذي يلي عبارة switch ككل ، وفي حال عدم وضع كلمة break فإن البرنامج يكمل التنفيذ ليبحث ضمن عبارات case حتى يجد حالة محققة ويقوم بتنفيذها.

الثاني عشر : التعامل مع الحلقات باستخدام : while , for , do  :

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



وكود الـ html  الذي ولد هذا الجدول هو : 
<html>
<head>
<title>Bob's Auto Parts - Freight Costs</title>
</head>
<body>
<table style="border: 0px; padding: 3px">
<tr>
<td style="background: #cccccc; text-align: center;">Distance</td>
<td style="background: #cccccc; text-align: center;">Cost</td>
</tr>
<tr>
<td style="text-align: right;">50</td>
<td style="text-align: right;">5</td>
</tr>
<tr>
<td style="text-align: right;">100</td>
<td style="text-align: right;">10</td>
</tr>
<tr>
<td style="text-align: right;">150</td>
<td style="text-align: right;">15</td>
</tr>
<tr>
<td style="text-align: right;">200</td>
<td style="text-align: right;">20</td>
</tr>
<tr>
<td style="text-align: right;">250</td>
<td style="text-align: right;">25</td>
</tr>
</table>
</body>
</html>
بدلاً من كتابة هذه الكود الطويل و المكلف للوقت والجهد سنستخدم عبارات التكرار باستخدام لغة PHP .

·         استخدام حلقات  while  :

أبسط أنواع الحلقات في الـ PHP هي حلقات while  ، وهي تعتمد على عبارات الشروط مثل عبارات if لكن الفرق بينها أن عبارات if  تنفذ الكود الذي يليها مرة واحدة في حال تحقق الشرط ، بينما تقوم حلقة while  بتنفيذ الكود الذي يليها عدة مرات طالما كان الشرط الذي يعتمد عليه التكرار محققاً ، ويقف التكرار عندما يصبح الشرط غير محقق.
 عادة ما نستخدم حلقة while عندما لا نعرف عدد التكرارات المطلوبة ، أما  إذا كنا نريد تكرار الكود عدد محدد من المرات عندها نستخدم حلقة   for .
الشكل العام لحلقة while هو :
while( condition ) expression;
 مثال حلقة تقوم بطباعة الأرقام من 1 إلى 5:
$num = 1;
while ($num <= 5 )
{
    echo $num."<br />";
    $num++;
}

في هذا المثال يتم اختبار الشرط في بداية كل تكرار فإذا كان الشرط خاطئا ، فإن كتلة التعليمات الموجودة بين الأقواس المتعرجة لن يتم تنفيذها وستنتهي الحلقة ، وسيتم تنفيذ البرنامج من السطر الذي يلي الحلقة ككل ، بينما إذا كان الشرط محققاً سيتم تنفيذ كتلة الكود الذي يليه إلى أن يصبح الشرط غير محقق.
يمكننا استخدام حلقة while  لعرض جدول الشحن السابق على الشكل التالي:
<html>
<head>
<title>Bob's Auto Parts - Freight Costs</title>
</head>
<body>
<table style="border: 0px; padding: 3px">
<tr>
<td style="background: #cccccc; text-align: center;">Distance</td>
<td style="background: #cccccc; text-align: center;">Cost</td>
</tr>
<?php
   $distance = 50;
   while ($distance <= 250) {
    echo "<tr>
    <td style=\"text-align: right;\">".$distance."</td>
    <td style=\"text-align: right;\">".($distance / 10)."</td>
    </tr>\n";
    $distance += 50;
 }
?>
</table>
</body>
</html>

في المثال السابق نلاحظ وجود الرمز  \ n   الذي يعبر عن المحرف الذي يقوم بالانتقال إلى سطر الجديد.

·         استخدام حلقات  for , foreach  :

بالنسبة لحلقات  while  نقوم بتعيين عداد لنبدأ بالعد منه ، وقبل كل تكرار نختبر هذا العداد ، وفي نهاية التكرار نعدل العداد .
أما حلقات for فهي على الشكل التالي:
for( expression1; condition; expression2)
    expression3;

expression1 : في هذا التعبير يتم تعيين العداد ، حيث ينفذ هذا التعبير مرة واحدة في البداية.
Condition :
هذا الشرط يتم فحصه في بداية كل تكرار ، إذا كان الشرط خاطئ توقف التكرار ، الشرط  سيكون اختبار للعداد فيما إذا كان قد وصل للحد المطلوب أو لا.
expression2 : في هذا التعبير ينفذ في نهاية كل تكرار ، حيث يتم هنا تعديل العداد.
expression3 : هذا التعبير ينفذ مرة واحدة في كل تكرار ، وهو يمثل كتلة التعليمات البرمجية .
يمكننا إعادة كتابة المثال السابق (جدول الشحن) مع حلقة for  على الشكل التالي:
<?php
for ($distance = 50; $distance <= 250; $distance += 50)
{
 echo "<tr>
 <td style=\"text-align: right;\">".$distance."</td>
 <td style=\"text-align: right;\">".($distance / 10)."</td>
 </tr>\n";
}
?>

بالإضافة إلى حلقة for ، هناك حلقة foreach ، مصممة خصيصًا للاستخدام مع المصفوفات. سنناقش كيفية استخدامها فيما بعد.

·         استخدام حلقات  do...while  :


هذه الحلقات لها الشكل العام التالي :
do
 expression;
while( condition );

الفرق بين هذه الحلقات وحلقات while   هو أن الشرط يتم اختباره في نهاية الحلقة ، وهذا يعني أن الكود الموجود داخل الحلقة يتم تنفيذه مرة واحدة على الأقل.
حتى ولو كان الشرط الموجود في نهاية الحلقة خاطئاً سيتم تنفيذ الحلقة مرة واحدة قبل التحقق من الشرط.
مثال :
$num = 100;
do{
      echo $num."<br />";
        }while ($num < 1 ) ;


الثالث عشر : الخروج من البرنامج النصي أو من بنية التحكم :

إذا كنا نريد التوقف عن تنفيذ جزء من التعليمات البرمجية ، يمكننا الاختيار من بين ثلاثة أساليب ، حسب السلوك الذي نحاول أن تسلكه.
إذا كنا نريد التوقف عن تنفيذ حلقة ، يمكننا استخدام عبارة break  التي ستوقف التنفيذ الحالي و تجعل البرنامج ينتقل إلى تنفيذ السطر البرمجي الذي يلي الحلقة.
أما إذا كنا نريد الانتقال إلى التكرار التالي من الحلقة ، فيمكننا بدلاً من ذلك استخدام عبارة continue .
بينما إذا كنا نريد الانتهاء من تنفيذ البرنامج النصي PHP بأكمله ، يمكننا استخدام عبارة  exit  ، حيث نحتاج إلى هذا السلوك عندما نقوم بإجراء فحص للأخطاء. على سبيل المثال ، يمكننا أن نكتب:
if($totalqty == 0)
{
 echo "You did not order anything on the previous page!<br />";
 exit;
}

هذا الاستدعاء يؤدي إلى إيقاف تنفيذ ما تبقى من البرنامج النصي.

·         صياغة بنية تحكم بديل:

هناك شكل بديل في بناء العبارات البرمجية يتكون من استبدال قوس الفتح المتعرج بنقطتين (:) وقوس الإغلاق المتعرج بكلمة مفتاحية جديدة هي endif  أو  endswitch  أو  endwhile  أو endfor  أو endforeach  وذلك بنية التحكم التي نستخدمها.
لا يوجد بنية تحكم بديلة من أجل الحلقات  do .. while .
على سبيل المثال الكود السابق يمكن أن تحويله إلى الشكل التالي:
if ($totalqty == 0) :
 echo "You did not order anything on the previous page!<br />";
 exit;
endif;

مروان المعلم / ماجستير بالاقتصاد المالي والنقدي
كاتب المقالة
كاتب ومحرر اخبار اعمل في موقع آفاق .

جديد قسم : استخدام لغة PHP

إرسال تعليق