الدوال في PHP: الجاهزة ومن تأليفك
كلما كبر برنامجك، ستجد نفسك تكرر نفس الأسطر في أماكن مختلفة: حساب سعر بعد الخصم، أو تنسيق تاريخ، أو فحص بريد إلكتروني. الدوال (Functions) تحل هذه المشكلة: تكتب الكود مرة واحدة وتعطيه اسماً، ثم تستدعيه كلما احتجته. في هذا الدرس ستتعرف على الدوال الجاهزة في PHP، وستكتب دوالك الخاصة.
الدوال الجاهزة
Section titled “الدوال الجاهزة”PHP تأتي مع آلاف الدوال الجاهزة. استخدمت بعضها فعلاً مثل echo و date و var_dump. وهذه أمثلة أخرى:
<?phpecho strlen("Hello") . "\n"; // طول النصecho strtoupper("php") . "\n"; // تحويل للأحرف الكبيرةecho round(3.14159, 2) . "\n"; // تقريب لرقمين عشريينecho max(4, 9, 2) . "\n"; // أكبر قيمة5PHP3.149دوال النصوص العربية
Section titled “دوال النصوص العربية”تذكّر من درس المتغيرات أن PHP تحسب البايتات لا الحروف. لاحظ الفرق:
<?phpecho strlen("مرحبا") . "\n";echo mb_strlen("مرحبا") . "\n";105الكلمة 5 حروف، لكن strlen تقول 10 لأن كل حرف عربي بايتان. الدوال التي تبدأ بـ mb_ (اختصار multibyte) تفهم الحروف العربية: mb_strlen للطول، و mb_substr لقص جزء من النص، و mb_strtoupper وغيرها. مع النصوص العربية استخدم دائماً دوال mb_.
تعريف دالة خاصة بك
Section titled “تعريف دالة خاصة بك”<?phpfunction greet() { echo "أهلاً بك في مدرسة البرمجة!\n";}
greet();greet();أهلاً بك في مدرسة البرمجة!أهلاً بك في مدرسة البرمجة!function: الكلمة التي تبدأ بها تعريف الدالة.greet: اسم الدالة، ويُفضّل أن يكون فعلاً يصف ما تفعله.- الكود بين
{ }لا يُنفَّذ عند التعريف، بل عند الاستدعاءgreet().
الدالة مثل وصفة طعام مكتوبة في دفتر: كتابتها لا تطبخ شيئاً، لكن كلما أردت الطبق تفتح الوصفة وتنفّذها.
المعاملات (Parameters)
Section titled “المعاملات (Parameters)”لجعل الدالة مرنة، نعطيها معاملات: متغيرات تستقبل قيماً مختلفة في كل استدعاء:
<?phpfunction greetStudent($name) { echo "أهلاً يا $name\n";}
greetStudent("سارة");greetStudent("عمر");أهلاً يا سارةأهلاً يا عمرإرجاع النتيجة بـ return
Section titled “إرجاع النتيجة بـ return”أغلب الدوال المفيدة لا تطبع النتيجة، بل تُرجعها لتستخدمها كما تريد:
<?phpfunction calcTotal($price, $quantity) { return $price * $quantity;}
$total = calcTotal(50, 3);echo "الإجمالي: $total\n";echo "مع الشحن: " . (calcTotal(50, 3) + 20) . "\n";الإجمالي: 150مع الشحن: 170الفرق بين echo و return مهم: echo تعرض النتيجة على الشاشة وتنتهي قصتها، أما return فتعطيك القيمة لتخزنها أو تحسب بها أو تمررها لدالة أخرى. وبمجرد تنفيذ return تخرج الدالة فوراً، ولا يُنفَّذ ما بعدها.
القيم الافتراضية
Section titled “القيم الافتراضية”يمكن أن تعطي المعامل قيمة تُستخدم إذا لم يرسل المستدعي قيمة:
<?phpfunction makeTea($sugar = 2) { return "شاي بـ $sugar ملاعق سكر";}
echo makeTea() . "\n";echo makeTea(0) . "\n";شاي بـ 2 ملاعق سكرشاي بـ 0 ملاعق سكرتحديد الأنواع
Section titled “تحديد الأنواع”في PHP الحديثة يمكنك تحديد نوع كل معامل ونوع القيمة المرجعة. هذا يجعل الكود أوضح، ويكشف الأخطاء مبكراً:
<?phpfunction average(int $a, int $b): float { return ($a + $b) / 2;}
echo average(7, 8);7.5int $a: المعامل يجب أن يكون عدداً صحيحاً.: floatبعد القوسين: الدالة ستُرجع عدداً عشرياً.
ومثال عملي يجمع ما سبق:
<?phpfunction grade(int $score): string { if ($score >= 90) return "ممتاز"; if ($score >= 50) return "ناجح"; return "راسب";}
echo grade(95) . "\n";echo grade(60) . "\n";echo grade(30) . "\n";ممتازناجحراسبنطاق المتغيرات
Section titled “نطاق المتغيرات”المتغيرات التي تُعرّف خارج الدالة لا تراها الدالة من الداخل، والعكس صحيح:
<?php$siteName = "مدرسة البرمجة";
function showName() { return isset($siteName) ? "موجود" : "غير موجود داخل الدالة";}
echo showName();غير موجود داخل الدالةالدالة مثل غرفة مغلقة: لا ترى ما في الغرف الأخرى. إذا احتاجت قيمة من الخارج، أرسلها لها كمعامل:
<?phpfunction showName2($name) { return "اسم الموقع: $name";}
echo showName2($siteName);اسم الموقع: مدرسة البرمجةهذا النطاق المنفصل (Scope) ميزة وليس عيباً: يمنع الدوال من تخريب متغيرات بعضها بالخطأ.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب دالة isAdult تستقبل العمر وتُرجع true إذا كان 18 أو أكثر:
<?phpfunction isAdult(int $age): bool { return $age >= 18;}
var_dump(isAdult(20));var_dump(isAdult(15));bool(true)bool(false)تحدٍّ: اكتب دالة priceAfterDiscount($price, $percent = 10) تُرجع السعر بعد خصم النسبة المعطاة.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان return: الدالة تحسب النتيجة لكن لا تُرجعها، فتحصل على
null. - استخدام متغير خارجي داخل الدالة: لن تجده. مرّره كمعامل.
- استخدام strlen مع العربية: تعطيك ضعف عدد الحروف. استخدم
mb_strlen.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج echo mb_strlen('بيت');؟
mb_strlen تحسب الحروف وليس البايتات، والكلمة 3 حروف. أما strlen فكانت ستعطي 6.
سؤال
ما الفرق بين echo و return داخل الدالة؟
return تعطي القيمة للكود المستدعي ليخزنها أو يستخدمها، وتُنهي الدالة فوراً.
الخلاصة
Section titled “الخلاصة”- PHP فيها آلاف الدوال الجاهزة، والتوثيق على php.net مرجعك.
- مع النصوص العربية استخدم دوال
mb_مثلmb_strlen. - تعرّف الدالة بـ
functionومعاملات، وتستدعيها باسمها. returnتُرجع النتيجة وتُنهي الدالة، والمعاملات يمكن أن تكون لها قيم افتراضية.- حدد الأنواع مثل
intوstringللوضوح، وتذكّر أن الدالة لا ترى المتغيرات الخارجية.