ممكن تعمل دالة تحسب قيمة وتطبعها وممكن تعمل دالة ترجع نفس القيمة من غير ما تطبع أي حاجة النتيجة ممكن تبان متشابهة في أول تجربة لكن الفرق بيظهر لما تحتاج تخزن القيمة أو تحولها أو تستخدمها في حساب تاني
هنستخدم أمثلة PHP صغيرة ونشوف الناتج في كل خطوة الأمثلة مستقلة عن بعض وشغل كل مثال لوحده في ال Terminal علشان تتابع السطور بوضوح
الفرق الأساسي بين return و echo و print
ال return داخل الدالة بتنهي تنفيذ الاستدعاء الحالي وبترجع قيمة للكود اللي استدعى الدالة أما echo و print فبيبعتوا نص للمخرجات وقت الوصول للسطر ومش بيوقفوا الدالة وحدهم
ال echo و print تراكيب لغوية في PHP مش دوال عادية ال echo مفيش قيمة راجعة منها وال print بترجع الرقم 1 بعد الطباعة هنشوف ليه الفرق ده مهم في مثال منفصل
دالة بتطبع الرسالة مباشرة
هنا وظيفة الدالة إنها تعرض رسالة ال void بتوضح إن الدالة مش بترجع قيمة تستخدمها كنتيجة للحساب
<?php
function showGreeting(): void
{
echo "Hello Osama" . PHP_EOL;
}
showGreeting();Hello Osamaأول ما استدعينا الدالة الرسالة اتطبعت ال PHP_EOL ثابت بيمثل نهاية السطر المناسبة لنظام التشغيل فالأمثلة دي أسهل في المتابعة من خلال ال Terminal
دالة بترجع الرسالة وبتسيب قرار عرضها ليك
الدالة التالية بترجع نص ال string بعد اسم الدالة تصريح بنوع القيمة الراجعة استدعاء الدالة من غير استخدام النتيجة مش هيطبع الرسالة
<?php
function getGreeting(): string
{
return "Hello Osama";
}
getGreeting();
$message = getGreeting();
echo $message . PHP_EOL;Hello Osamaالرسالة ظهرت مرة واحدة عند echo بس أول استدعاء نفذ الدالة فعلا لكنه تجاهل القيمة الراجعة ومفيش في جسم الدالة أمر للطباعة
تخزين النتيجة وتحويلها قبل العرض
لو رجعنا الاسم كنص نقدر نغير أول حرف فيه أو نضيفه لرسالة من غير ما يظهر قبل الوقت اللي اخترناه ال ucfirst دالة جاهزة بتحول أول حرف إنجليزي صغير لحرف كبير
<?php
function getName(): string
{
return "osama";
}
$name = getName();
$displayName = ucfirst($name);
echo $displayName . PHP_EOL;
echo "Welcome " . $displayName . PHP_EOL;Osama
Welcome Osamaالقيمة هنا اتخزنت في متغير واتستخدمت مرتين الدالة نفسها مش بتحتفظ بالنتيجة لمجرد وجود return داخلها وكل استدعاء جديد بيشغل جسمها من جديد
الطباعة مش معناها إن الدالة رجعت نفس النص
خلينا نجرب دالة من غير تصريح نوع راجع وداخلها echo بس هنخزن نتيجة الاستدعاء ونفحصها باستخدام var_dump اللي بتوضح نوع وقيمة المتغير
<?php
function showName()
{
echo "osama" . PHP_EOL;
}
$name = showName();
var_dump($name);osama
NULLالاسم اتطبع أثناء تنفيذ الدالة لكن المتغير قيمته null لأن الدالة خلصت من غير return بقيمة معنى إنك شفت الاسم على الشاشة مش إن المتغير بقى شايل الاسم
متاخدش النتيجة دي وتبعتها لدالة محتاجة نص وانت متوقع إنها الاسم الحل إن دالة جلب الاسم ترجع نص واضح زي المثال السابق
ال return بتوقف بقية الدالة في الاستدعاء الحالي
نقدر نستخدم الرجوع المبكر لما نكون وصلنا للإجابة من غير تنفيذ بقية الدالة ده مفيد لتبسيط حالات زي عدم وجود رصيد أو عدم تحقق شرط
<?php
function stockLabel(int $quantity): string
{
if ($quantity <= 0) {
return "Out of stock";
}
return "Available";
}
echo stockLabel(0) . PHP_EOL;
echo stockLabel(5) . PHP_EOL;
echo "Check finished" . PHP_EOL;Out of stock
Available
Check finishedلما الكمية كانت صفر الدالة رجعت أول رسالة ومكملتش للسطر اللي بيرجع Available لكن الكود اللي بعد الاستدعاء كمل عادي ال return هنا بتخرج من الدالة مش بتوقف البرنامج كله
ليه return print مش بترجع الرسالة
ال print بتطبع النص وقيمتها الراجعة 1 فلو كتبت return print هتطبع أثناء تنفيذ الدالة وبعدين ترجع رقم بدل النص اللي كنت متوقعه
<?php
function printGreeting(): int
{
return print "Hello Osama" . PHP_EOL;
}
$result = printGreeting();
var_dump($result);Hello Osama
int(1)لو هدفك ترجع الرسالة نفسها اكتب return ومعاها النص مباشرة زي getGreeting ال print مش طريقة لتخزين النص وال echo أصلا مش تعبير ليه قيمة راجعة تقدر تسندها لمتغير
مثال عملي لحساب الإجمالي ثم استخدامه
لما نفصل الحساب عن الطباعة نقدر نستخدم الناتج في شرط أو نضيف عليه قيمة تانية ونختبره من غير ما الدالة تطبع كل مرة المثال بيستخدم أعداد صحيحة لتبسيط الفكرة
<?php
function calculateTotal(int $unitPrice, int $quantity): int
{
return $unitPrice * $quantity;
}
$total = calculateTotal(100, 3);
$shipping = $total >= 250 ? 0 : 25;
echo "Total: " . $total . PHP_EOL;
echo "Shipping: " . $shipping . PHP_EOL;
echo "Final: " . ($total + $shipping) . PHP_EOL;Total: 300
Shipping: 0
Final: 300الدالة مسؤولة عن حساب الإجمالي والكود اللي بيستخدمها مسؤول عن الشحن والعرض كده تقدر تستخدم نفس الحساب في صفحة أو استجابة API أو اختبار من غير مخرجات زيادة
هل كل دالة لازم ترجع قيمة
مش لازم فيه دالة وظيفتها طباعة رسالة أو إرسال إشعار أو تنفيذ إجراء بنستخدم void لما يكون المقصود إن الدالة مفيش منها قيمة راجعة مفيدة وتقدر تستخدم return من غير قيمة للخروج المبكر منها
<?php
function showNotice(bool $enabled): void
{
if (!$enabled) {
return;
}
echo "Backup completed" . PHP_EOL;
}
showNotice(false);
showNotice(true);Backup completedإرجاع النص مش بيجهزه للعرض الآمن في HTML
ال return مش بتعقم البيانات وال echo مش بتحول النص تلقائيا لنص آمن لو القيمة هتظهر كنص داخل HTML استخدم الهروب المناسب للسياق المثال التالي هيعرض العلامات كنص بدل تفسيرها كعنصر
<?php
function getLabel(): string
{
return "<strong>Book</strong>";
}
echo htmlspecialchars(getLabel(), ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");في المتصفح هتشوف النص <strong>Book</strong> نفسه ومش كلمة Book بخط عريض المثال عن محتوى نصي داخل HTML والسياقات التانية زي JavaScript أو الروابط ليها قواعدها
تختار إيه أثناء كتابة الدالة
لو الدالة بتحسب أو بتجهز بيانات استخدم return علشان تقدر تعيد استخدام النتيجة ولو وظيفتها المعلنة عرض محتوى استخدم echo أو print جوه طبقة العرض وخلي اسم الدالة يوضح قصدها
الفصل ده اختيار لتنظيم الشغل مش منع تقني إن الدالة تعمل أكتر من حاجة المهم تعرف في كل استدعاء هل محتاج قيمة ترجعلك ولا إجراء يحصل وقت التنفيذ