تخطَّ إلى المحتوى

الدوال في PHP: الجاهزة ومن تأليفك

الدرس 5 من 12 · PHP

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

PHP تأتي مع آلاف الدوال الجاهزة. استخدمت بعضها فعلاً مثل echo و date و var_dump. وهذه أمثلة أخرى:

<?php
echo strlen("Hello") . "\n"; // طول النص
echo strtoupper("php") . "\n"; // تحويل للأحرف الكبيرة
echo round(3.14159, 2) . "\n"; // تقريب لرقمين عشريين
echo max(4, 9, 2) . "\n"; // أكبر قيمة
الناتج
5
PHP
3.14
9

تذكّر من درس المتغيرات أن PHP تحسب البايتات لا الحروف. لاحظ الفرق:

<?php
echo strlen("مرحبا") . "\n";
echo mb_strlen("مرحبا") . "\n";
الناتج
10
5

الكلمة 5 حروف، لكن strlen تقول 10 لأن كل حرف عربي بايتان. الدوال التي تبدأ بـ mb_ (اختصار multibyte) تفهم الحروف العربية: mb_strlen للطول، و mb_substr لقص جزء من النص، و mb_strtoupper وغيرها. مع النصوص العربية استخدم دائماً دوال mb_.

<?php
function greet() {
echo "أهلاً بك في مدرسة البرمجة!\n";
}
greet();
greet();
الناتج
أهلاً بك في مدرسة البرمجة!
أهلاً بك في مدرسة البرمجة!
  • function: الكلمة التي تبدأ بها تعريف الدالة.
  • greet: اسم الدالة، ويُفضّل أن يكون فعلاً يصف ما تفعله.
  • الكود بين { } لا يُنفَّذ عند التعريف، بل عند الاستدعاء greet().

الدالة مثل وصفة طعام مكتوبة في دفتر: كتابتها لا تطبخ شيئاً، لكن كلما أردت الطبق تفتح الوصفة وتنفّذها.

لجعل الدالة مرنة، نعطيها معاملات: متغيرات تستقبل قيماً مختلفة في كل استدعاء:

<?php
function greetStudent($name) {
echo "أهلاً يا $name\n";
}
greetStudent("سارة");
greetStudent("عمر");
الناتج
أهلاً يا سارة
أهلاً يا عمر

أغلب الدوال المفيدة لا تطبع النتيجة، بل تُرجعها لتستخدمها كما تريد:

<?php
function 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 تخرج الدالة فوراً، ولا يُنفَّذ ما بعدها.

يمكن أن تعطي المعامل قيمة تُستخدم إذا لم يرسل المستدعي قيمة:

<?php
function makeTea($sugar = 2) {
return "شاي بـ $sugar ملاعق سكر";
}
echo makeTea() . "\n";
echo makeTea(0) . "\n";
الناتج
شاي بـ 2 ملاعق سكر
شاي بـ 0 ملاعق سكر

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

<?php
function average(int $a, int $b): float {
return ($a + $b) / 2;
}
echo average(7, 8);
الناتج
7.5
  • int $a: المعامل يجب أن يكون عدداً صحيحاً.
  • : float بعد القوسين: الدالة ستُرجع عدداً عشرياً.

ومثال عملي يجمع ما سبق:

<?php
function 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";
الناتج
ممتاز
ناجح
راسب

المتغيرات التي تُعرّف خارج الدالة لا تراها الدالة من الداخل، والعكس صحيح:

<?php
$siteName = "مدرسة البرمجة";
function showName() {
return isset($siteName) ? "موجود" : "غير موجود داخل الدالة";
}
echo showName();
الناتج
غير موجود داخل الدالة

الدالة مثل غرفة مغلقة: لا ترى ما في الغرف الأخرى. إذا احتاجت قيمة من الخارج، أرسلها لها كمعامل:

<?php
function showName2($name) {
return "اسم الموقع: $name";
}
echo showName2($siteName);
الناتج
اسم الموقع: مدرسة البرمجة

هذا النطاق المنفصل (Scope) ميزة وليس عيباً: يمنع الدوال من تخريب متغيرات بعضها بالخطأ.

اكتب دالة isAdult تستقبل العمر وتُرجع true إذا كان 18 أو أكثر:

<?php
function isAdult(int $age): bool {
return $age >= 18;
}
var_dump(isAdult(20));
var_dump(isAdult(15));
الناتج المتوقع
bool(true)
bool(false)

تحدٍّ: اكتب دالة priceAfterDiscount($price, $percent = 10) تُرجع السعر بعد خصم النسبة المعطاة.

  • نسيان return: الدالة تحسب النتيجة لكن لا تُرجعها، فتحصل على null.
  • استخدام متغير خارجي داخل الدالة: لن تجده. مرّره كمعامل.
  • استخدام strlen مع العربية: تعطيك ضعف عدد الحروف. استخدم mb_strlen.

سؤال

ما ناتج echo mb_strlen('بيت');؟

سؤال

ما الفرق بين echo و return داخل الدالة؟

  • PHP فيها آلاف الدوال الجاهزة، والتوثيق على php.net مرجعك.
  • مع النصوص العربية استخدم دوال mb_ مثل mb_strlen.
  • تعرّف الدالة بـ function ومعاملات، وتستدعيها باسمها.
  • return تُرجع النتيجة وتُنهي الدالة، والمعاملات يمكن أن تكون لها قيم افتراضية.
  • حدد الأنواع مثل int و string للوضوح، وتذكّر أن الدالة لا ترى المتغيرات الخارجية.