ارسال آرگومان به روش ارجاع و مقدار

آرگومانها را می توان به کمک ارجاع ارسال کرد. این بدان معناست که شما آدرس متغیری را ارسال می کنید نه مقدار آن را. ارسال با ارجاع زمانی مفید است که شما بخواهید یک آرگومان که دارای مقدار بزرگی است (مانند یک آبجکت) را ارسال کنید. در این حالت وقتی که آرگومان ارسال شده را در داخل متد اصلاح می کنیم مقدار اصلی آرگومان در خارج از متد هم تغییر می کند. اما در روش مقدار مقدار اصلی آرگومان در خارج از متد تغییر نمی کند. در زیر دستورالعمل پایه ای تعریف پارامتر ها که در آنها به جای مقدار از آدرس استفاده شده است نشان داده شده :

function FunctionName(& param1)
{
   code to execute;
}

همانطور که در کد بالا مشاهده می کنید باید قبل از پارامتری که قرار است به روش ارجاع مقداری به آن ارسال شود علامت ( & ) قرار داده شود. اجازه دهید که تفاوت بین ارسال با ارجاع و ارسال با مقدار آرگومان را با یک مثال توضیح دهیم.

  1: <?php
  2:     function ModifyNumberVal($number)
  3:     {
  4:         $number += 10;
  5:         echo 'Value of number inside method is '.$number.'<br/>';
  6:     }
  7: 
  8:     function ModifyNumberRef(&$number)
  9:     {
 10:         $number += 10;
 11:         echo 'Value of number inside method is '.$number.'<br/>';
 12:     }
 13: 
 14:     $num = 5;
 15: 
 16:     echo 'num = '.$num;
 17:     
 18:     echo '<br/><br/>';
 19: 
 20:     echo 'Passing num by value to method ModifyNumberVal() ...<br/>';
 21:     ModifyNumberVal($num);
 22:     echo 'Value of num after exiting the method is '.$num.'<br/>';
 23: 	
 24:     echo '<br/><br/>';
 25: 	
 26:     echo 'Passing num by ref to method ModifyNumberRef() ...<br/>';
 27:     ModifyNumberRef($num);
 28:     echo 'Value of num after exiting the method is  '. $num.'<br/>';
 29: ?>
num = 5

Passing num by value to method ModifyNumberVal() ...
Value of number inside method is 15.
Value of num after exiting the method is 5.

Passing num by ref to method ModifyNumberRef() ...
Value of number inside method is 15.
Value of num after exiting the method is 15.

در برنامه بالا دو متد که دارای یک هدف یکسان هستند تعریف شده اند و آن اضافه کردن عدد 10 به مقداری است که به آنها ارسال می شود. اولین متد (خطوط 6-2) دارای یک پارامتر است که نیاز به یک مقدار آرگومان دارد. وقتی که متد را صدا می زنیم و آرگومانی به آن اختصاص می دهیم (خط 21) ،کپی آرگومان به پارامتر متد ارسال می شود. بنابراین مقدار اصلی متغیر خارج از متد (num$) هیچ ارتباطی به پارامتر متد ندارد.سپس مقدار 10 را به متغیر پارامتر(number) اضافه کرده و نتیجه را چاپ می کنیم (خطوط 5 و 4). برای اثبات اینکه متغیر num$ هیچ تغییری نکرده است مقدار آن را یکبار دیگر چاپ کرده و مشاهده می کنیم که تغییری نکرده است (خط 22). دومین متد (خطوط 12-8) نیاز به یک مقدار با ارجاع دارد. در این حالت به جای اینکه یک کپی از مقدار به عنوان آرگومان به ان ارسال شود آدرس متغیر به آن ارسال می شود. حال پارامتر به مقدار اصلی متغیر که زمان فراخوانی متد به آن ارسال می شود دسترسی دارد. وقتی که ما مقدار متغیر پارامتری که شامل آدرس متغیر اصلی است را تغییر می دهیم (خط 10) در واقع مقدار متغیر اصلی در خارج از متد را تغییر داده ایم. در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش می دهیم و مشاهده می شود که مقدار آن واقعا تغییر کرده است.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر مطرح بفرمایید.