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

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

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) در واقع مقدار متغیر اصلی در خارج از متد را تغییر داده‌ایم. در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش می‌دهیم و مشاهده می‌شود که مقدار آن واقعاً تغییر کرده است.