الدوال المعرّفة من طرف المستخدم في PHP

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث

يمكن تعريف الدالة باستخدام الصيغة التالية:

المثال 1: صيغة التعريف عن الدوال

<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Example function.\n";
return $retval;
}
?>

يمكن إضافة أي نوع من الشيفرة داخل الدالة، بل ويمكن إضافة دوالّ أخرى أو تعريف أصناف داخل الدالة.

تتبع أسماء الدوالّ نفس القواعد المتبّعة في اللغة للتسمية. يبدأ الاسم الصحيح للدالة بحرف أو شرطة سفلية، متبوعًا بأيّ عددٍ من الحروف أو الأرقام أو الشرطات السفلية. ويمكن التعبير عن هذه الصيغة باستخدام التعابير النمطية بالصورة التالية: ‎[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*‎.

نصيحة: راجع دليل تسمية Userland.

لا حاجة إلى تعريف الدوالّ قبل الإشارة إليها- أي يمكنك أثناء كتابة الشيفرة البرمجية كتابة إستدعاء الدالة قبل كتابة تعريفها.

باستثناء الحالة التي تُعرّف فيها الدوّال شرطيًا كما هو موضّح في المثالين أدناه.

عندما يكون تعريف الدالة مشروطًا، يجب أن تُعرّف الدالة قبل استدعائها.

لاحظ في المثال التالي أنّه لا يمكن استدعاء الدالة foo()‎ في البداية لأنّها غير موجودة بعد، ولكن يمكن استدعاء الدالة bar()‎، ولكن بعد إضافة الجملة الشرطية يصبح بالإمكان استدعاء الدالة foo()‎ لأن نتيجة العبارة الشرطية هي true.

المثال 2: الدوال الشرطية

<?php

$makefoo = true;


/* foo();
 لا يمكن استدعائها هنا لأنّها لا تزال غير معرّفة */

/* bar();
  يمكن استدعائها هنا  */

bar();

if ($makefoo) {
  function foo()
  {
    echo "I don't exist until program execution reaches me.\n";
  }

}

/* foo();
 يمكن استدعاء الدالة هنا لتحقّق العبارة الشرطية */

if ($makefoo) foo();

function bar()
{
  echo "I exist immediately upon program start.\n";
}

?>

في المثال التالي لا يمكن استدعاء الدالة bar()‎ في البداية لأنّها لا تزال غير معرّفة، ولكن بعد معالجة الدالة foo()‎ تصبح الدالة bar()‎ متاحة للاستدعاء.

المثال 3: استخدام الدوال داخل الدوال

<?php
function foo()
{
  function bar() 
  {
    echo "I don't exist until foo() is called.\n";
  }

}

/* لا يمكن استدعاء الدالة هنا لأنّها غير موجودة */

foo();

/* أصبحت الدالة متاحة للاستدعاء */

bar();

?>

تمتلك جميع الدوالّ والأصناف في PHP نطاقًا عامًّا global scope، بمعنى أنّه يمكن استدعاؤها من خارج الدالة حتى لو كانت معرّفة داخل دالّة أخرى والعكس صحيح أيضًا.

لا تدعم PHP خاصية زيادة التحميل (overloading) بالنسبة للدوال، ولا يمكن أيضًا إلغاء تعريف دالة أو إعادة تعريف دالة معرّفة مسبقًا.

ملاحظة: أسماء الدوالّ غير حسّاسة لحالة الأحرف، ولكن يفضّل استدعاء الدوال بنفس الحروف المستخدمة لتعريفها.

تدعم الدوال في PHP عددًا متغيرًا من المعاملات والمعاملات الافتراضية. وللمزيد من المعلومات راجع التوثيقات الخاصّة بالدوال func_num_args()‎‎ و func_get_arg()‎‎ و func_get_args()‎‎.

يمكن استدعاء الدوال التعاودية (recursive functions) في PHP.

المثال 4: الدوال التعاودية

<?php
function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }

}
?>

ملاحظة: يمكن للدوالّ أو التوابع التكرارية التي تصل مستويات التكرار فيها 100 أو 200 مرحلة أن تتسبّب في تحطيم مكدس الاستدعاء stack وإيقاف عمل الشيفرة. أما المستويات اللانهائية من التكرار فتعدّ خطأً برمجيًا.

مصادر