تُعرَّف دالة PHP بالكلمة function، واسم، وقائمة معاملات، وجسم؛ وترسل return قيمة إلى المستدعي. يعرّفها function add(int $a, int $b): int { return $a + $b; }، ويستدعيها add(2, 3) فيعيد 5.
string وint قبل المعاملات تصريحات بالأنواع، و: string بعد القوسين هو نوع القيمة المعادة. كلاهما اختياري، لكنهما يكشفان الأخطاء مبكرًا ويوثّقان ما تتوقعه الدالة.
القيم المعادة وإعادة عدة قيم
تنهي return الدالة فورًا. والدالة التي لا return فيها، أو فيها return; مجردة، تعيد null؛ صرّح بـ : void عندما لا تُستدعى إلا لأثرها. تعيد الدالة قيمة واحدة، لكن تلك القيمة قد تكون مصفوفة، تفككها عند الاستدعاء:
راجع تفكيك المصفوفات لصيغ [...] = الأخرى.
المعاملات الافتراضية والوسائط المسماة
المعامل ذو = value اختياري: يمكن للمستدعين حذفه. وتأتي المعاملات الاختيارية بعد الإلزامية. ومنذ PHP 8.0، تتيح الوسائط المسماة للمستدعي تمرير أي معامل باسمه، فيمكنك تخطي الاختيارية التي لا تحتاجها.
تجعل الوسائط المسماة استدعاءات الدوال المدمجة مقروءة أيضًا: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). يصبح اسم المعامل جزءًا من الواجهة العامة للدالة، لذا قد تكسر إعادة تسمية معامل المستدعين الذين يستخدمون الأسماء.
التمرير بالمرجع
عادة تمرر PHP نسخة من كل وسيط، فلا تستطيع الدالة تغيير متغير المستدعي. و& قبل المعامل تمرر المتغير نفسه. وتعمل الدوال المدمجة مثل sort() بهذه الطريقة.
إعادة قيمة جديدة أوضح عادة من تغيير وسيط. استخدم المراجع عندما يكون الغرض من الدالة فعلًا تعديل شيء في مكانه.
التصريح بالأنواع وstrict_types
افتراضيًا تحوّل PHP الوسائط إلى النوع المصرّح به عندما تستطيع: تحوّل add("5", 3) النص "5" إلى 5. ووضع declare(strict_types=1); في أعلى الملف تمامًا يوقف ذلك في الاستدعاءات التي تجري في ذلك الملف، فيرمي النوع الخاطئ TypeError بدل أن يُحوَّل.
دون سطر declare، يطبع الاستدعاء نفسه 8. والنصوص التي ليست أعدادًا، مثل "five"، ترمي TypeError في الوضعين.
الأنواع التي يمكنك التصريح بها للمعاملات والقيم المعادة:
never نوع قيمة معادة للدوال التي ترمي استثناءً أو تنهي التنفيذ دائمًا. وتعمل أسماء الأصناف والواجهات أنواعًا أيضًا.
عدد متغير من الوسائط بـ ...$args
تجمع ...$numbers أي عدد من الوسائط في مصفوفة. و... نفسها عند الاستدعاء تبسط مصفوفة إلى وسائط منفصلة.
استخدام متغير خارجي داخل دالة
للدالة نطاقها الخاص. والمتغير المعرّف خارجها غير مرئي داخلها، وهذا يفاجئ القادمين من JavaScript:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
وتعيد الدالة السعر دون الضريبة. مرّر القيمة معاملًا بدلًا من ذلك. هذا يجعل الدالة صريحة بشأن ما تعتمد عليه وسهلة الاختبار:
تعمل الكلمة global أيضًا، لكنها تخفي الاعتماد؛ وتشرحها صفحة نطاق المتغيرات. وللدوال القصيرة التي تُمرر إلى دوال أخرى، مثل دوال الاستدعاء لـ array_map()، راجع الدوال المجهولة، التي تستطيع التقاط المتغيرات الخارجية بـ use.
الأسئلة الشائعة
كيف أعرّف دالة في PHP؟
استخدم الكلمة function، واسمًا، ومعاملات بين قوسين، وجسمًا: function add(int $a, int $b): int { return $a + $b; }. واستدعها بـ add(2, 3). أسماء الدوال غير حساسة لحالة الأحرف، والدالة المعرّفة في المستوى الأعلى من ملف يمكن استدعاؤها قبل السطر الذي يعرّفها.
كيف أعيد عدة قيم من دالة في PHP؟
أعِد مصفوفة وفكّكها: function minMax(array $a): array { return [min($a), max($a)]; } ثم [$min, $max] = minMax([3, 1, 4]);. وللنتائج المسماة، أعِد مصفوفة ترابطية واستخدم ['min' => $min] = ....
ماذا تفعل declare(strict_types=1)؟
توقف التحويل التلقائي للأنواع في الاستدعاءات التي تجري من ذلك الملف، فيرمي تمرير "5" إلى معامل int الخطأ TypeError بدل تحويلها إلى 5. يجب أن تكون الجملة الأولى تمامًا في الملف ولا تؤثر إلا في ذلك الملف.
ما هي الوسائط المسماة في PHP؟
منذ PHP 8.0 يمكنك تمرير الوسائط باسم المعامل: htmlspecialchars($s, double_encode: false). يمكن إعطاؤها بأي ترتيب بعد الوسائط الموضعية، وتتيح لك تخطي المعاملات الاختيارية التي لا تريد تغييرها.
كيف أمرر متغيرًا بالمرجع في PHP؟
ضع & قبل المعامل: function addOne(int &$n): void { $n++; }. عندها تغيّر الدالة متغير المستدعي. ودون &، تمرر PHP نسخة ويبقى متغير المستدعي كما هو.