🚀 تخفیف ۳۵٪ + ۳.۵ میلیون هدیه! برنامه‌نویسی رو الان شروع کن - فقط امروز!
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ phpJunior
pass by reference
جامعه پی اچ پی ایجاد شده در ۲۳ خرداد ۱۴۰۲

سلام.

یک سوال داشتم. من متوجه نشدم کاربر & چی هست.

توی کد زیر ما اگر از assign(=) در تا بع استفاده نکنیم مانند یک argoman by value رفتار میکنه. من تفاوتش رو متوجه نشدم.


function geivIt(&$num = null)  {
# ba assign (=)
     return $num *= 4;
     echo $num;
}
echo $num =7 . "
"
; echo geivIt($num). "
"
; echo $num;

7
28
28

بدون = :


function geivIt(&$num = null)
{
# bedoone assign =
    return $num * 4;
    echo $num;
}
echo $num = 7 . "
"
; echo geivIt($num) . "
"
; echo $num;

7
28
7

سلام،

جفت تعاریف توابع بصورت pass by reference هستند.

pass by reference یعنی شما فرض کنید همون متغیری که در بیرون دارید رو بردید داخل تابع و دارید تغییرات روش اعمال میکنید. در اصل اشاره گری به مرجع هست. مرجعش در بیرون تابع هست که پاس داده شده بهش.

یک مثال بیارم:

function geivIt(&$num)
{
    $num = 100;
}
$test = 2;
geivIt($test);
echo $test; // 100

اسامی متغیرهارو تغییر دادم که بدونید همنامی در اینجا اهمیتی ندارد.

در اینجا متغیر $test پاس داده شده. طبق تعریف تابع بصورت pass by reference هست.

$num مرجعش کدوم متغیره؟ یعنی به کدوم متغیر اشاره میکنه؟ به متغیر $test. پس میتونیم فرض کنیم در این حالت $num نام مستعاری برای $test هست تا بهتر درک کنیم. پس اگر $num مقدارش تغییر کند، انگار مقدار $test تغییر کرده است.


در مثال‌های بالا، اولین مثالتون داشتیم $num *= 4 علامت = نشان دهنده این است که مقدار $num تغییر میکند. پس مرجع اش یعنی $num بیرون از تابع هم تغییر میکند. اما در مثال دوم داشتیم $num * 4 آیا = آمده که مقدار $num تغییر کند؟ خیر پس مقدار مرجع اش یعنی $num بیرون از تابع هم تغییری نمیکند. ولی از آنجایی که return کردید مقدار 28 رو این قسمت از کد echo geivIt($num) مقدار برگشتی یعنی 28 چاپ میکند(در خروجی نشان میدهد) ولی تأثیری در خط بعدی ندارد.

یه نکته:

return $num * 4;
echo $num;

echo $num بعد از return بی معنیست چون بعد از اجرای return هیچ کدی داخل تابع اجرا نمیشود.

اگر جایی از توضیحات گنگ بود، بگید تا بیشتر توضیح بدم.

بهترین پاسخ
محسن موحد ۲۴ خرداد ۱۴۰۲، ۰۰:۴۰

ممنون جناب موحد عزیز,

بسیار کامل و قابل فهم . ممنون از وقتی که گذاشتید و نکته ای که اشاره کردید.

phpJunior ۲۶ خرداد ۱۴۰۲، ۱۲:۴۶