الفرق بين المراجعتين لصفحة: «PHP/user defined functions»
ط استبدال النص - 'PHP\/([^|-]*)-([^|-]*)-([^|-]*)' ب'PHP/$1_$2_$3' |
لورنس-عثمان (نقاش | مساهمات) مزيد من التوضيح للجملة -لا حاجة إلى تعريف الدوالّ قبل الإشارة إليها |
||
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين) | |||
سطر 19: | سطر 19: | ||
نصيحة: راجع [[PHP/Userland Naming|دليل تسمية Userland.]] | نصيحة: راجع [[PHP/Userland Naming|دليل تسمية Userland.]] | ||
لا حاجة إلى تعريف الدوالّ قبل الإشارة | لا حاجة إلى تعريف الدوالّ قبل الإشارة إليها- أي يمكنك أثناء كتابة الشيفرة البرمجية كتابة إستدعاء الدالة قبل كتابة تعريفها. | ||
باستثناء الحالة التي تُعرّف فيها الدوّال شرطيًا كما هو موضّح في المثالين أدناه. | |||
عندما يكون تعريف الدالة مشروطًا، يجب أن تُعرّف الدالة قبل استدعائها. | عندما يكون تعريف الدالة مشروطًا، يجب أن تُعرّف الدالة قبل استدعائها. | ||
سطر 34: | سطر 36: | ||
$makefoo = true; | $makefoo = true; | ||
/* لا يمكن | |||
/* foo(); | |||
لا يمكن استدعائها هنا لأنّها لا تزال غير معرّفة */ | |||
/* bar(); | |||
يمكن استدعائها هنا */ | |||
bar(); | bar(); | ||
سطر 46: | سطر 53: | ||
} | } | ||
/* يمكن استدعاء الدالة هنا لتحقّق العبارة الشرطية */ | /* foo(); | ||
يمكن استدعاء الدالة هنا لتحقّق العبارة الشرطية */ | |||
if ($makefoo) foo(); | if ($makefoo) foo(); |
المراجعة الحالية بتاريخ 17:59، 23 ديسمبر 2018
يمكن تعريف الدالة باستخدام الصيغة التالية:
المثال 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 وإيقاف عمل الشيفرة. أما المستويات اللانهائية من التكرار فتعدّ خطأً برمجيًا.