ممكن تعمل دالة تحسب قيمة وتطبعها وممكن تعمل دالة ترجع نفس القيمة من غير ما تطبع أي حاجة النتيجة ممكن تبان متشابهة في أول تجربة لكن الفرق بيظهر لما تحتاج تخزن القيمة أو تحولها أو تستخدمها في حساب تاني

هنستخدم أمثلة 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 جوه طبقة العرض وخلي اسم الدالة يوضح قصدها

الفصل ده اختيار لتنظيم الشغل مش منع تقني إن الدالة تعمل أكتر من حاجة المهم تعرف في كل استدعاء هل محتاج قيمة ترجعلك ولا إجراء يحصل وقت التنفيذ

مصادر للتوسع