PHP - Call by Reference

PHP sử dụng cơ chế "gọi theo giá trị" (call by value) theo mặc định để truyền tham số đến một hàm. Nếu các tham số trong hàm được thay đổi, những thay đổi đó sẽ không phản ánh ra bên ngoài hàm. Để cho phép một hàm sửa đổi các tham số của nó, cơ chế "gọi theo tham chiếu" (call by reference) phải được sử dụng.

Trong PHP, một biến tham chiếu hoạt động như một "bí danh" cho biến gốc hoặc biến chủ, để cả hai có thể đọc và ghi một giá trị duy nhất. Nói cách khác, các biến với hai tên khác nhau có thể truy cập cùng một giá trị và chúng hoạt động như thể chúng là cùng một biến.

Đoạn mã PHP sau sẽ giúp bạn hiểu các tham chiếu là gì. Ở đây, $var là một biến chuỗi bình thường. Chúng ta khai báo $var1 như một tham chiếu đến $var , thêm ký hiệu "&" vào biến sau.

$var = "Hello";
$var1 = &$var;

Khi chúng ta nói rằng $var1 là một bí danh hoặc tham chiếu của $var , điều đó có nghĩa là bất kỳ thay đổi nào trong giá trị của nó cũng sẽ thay đổi giá trị của $var , và ngược lại.

Example

Ví dụ sau đây minh họa cách "gọi theo tham chiếu" hoạt động trong PHP −

<?php  
   $var = "Hello";
   $var1 = &$var;

   $var1 = "Hello World";
   echo "var=$var var1=$var1" . PHP_EOL;

   $var = "How are you?";
   echo "var=$var var1=$var1" . PHP_EOL;
?>

Nó sẽ tạo ra output

var=Hello World var1=Hello World
var=How are you? var1=How are you?

Calling a PHP Function by Reference

Để gọi một hàm theo tham chiếu, bạn cần khai báo các tham số chính thức với tên được thêm tiền tố bằng ký hiệu "&".

function callref(&$arg1, &$arg2) {
   Statements;
}

Cuộc gọi đến hàm giống như trong phương pháp "gọi theo giá trị".

callref($x, $y);

Khi hàm được gọi, $arg1 trở thành một tham chiếu đến $x $arg2 trở thành một tham chiếu đến $y .

Nếu, bên trong thân hàm, giá trị của $arg1 hoặc $arg2 (hoặc cả hai) thay đổi, điều đó cũng sẽ khiến giá trị của $x $y thay đổi.

Example

Hãy xem xét ví dụ sau đây −

<?php  
   function  change_name(&$nm) {
      echo "Initially the name is $nm" . PHP_EOL;
      $nm = $nm."_new";
      echo "This function changes the name to $nm" . PHP_EOL;
   }

   $name = "John";
   echo "My name is $name" . PHP_EOL;
   change_name($name);
   echo "My name now is $name" . PHP_EOL;
?>

Biến $name được truyền vào hàm change_name() . Một biến tham chiếu &$nm trở thành biến tham chiếu của nó. Mọi thay đổi trong $nm sẽ được phản ánh trong $name bên ngoài hàm.

Nó sẽ tạo ra output

My name is John
Initially the name is John
This function changes the name to John_new
My name now is John_new

Swapping Two Variables

Trong đoạn mã PHP sau, chúng ta gọi một hàm bằng cách truyền các tham số theo giá trị. Hàm cố gắng hoán đổi giá trị của chúng.

Bên trong hàm, giá trị của chúng được thay đổi, nhưng sự hoán đổi này không phản ánh trong các đối số thực tế sau khi hàm được thực thi.

Khi cùng một hàm được gọi bằng cách truyền tham số theo tham chiếu, hiệu ứng hoán đổi cũng được phản ánh trong các tham số thực tế.

<?php  
   function  swap_value($a, $b) {
      echo "Initial values a = $a b = $b \n";
      $c = $a; $a = $b; $b = $c;
      echo "Swapped values a = $a b = $b \n";
   }

   $x = 10; $y =20;
   echo "Actual arguments x = $x y = $y \n\n";

   swap_value($x, $y);
   echo "Actual arguments do not change after the function: \n";
   echo "x = $x y = $y \n\n";

   function  swap_ref(&$a, &$b) {
      echo "Initial values a = $a b = $b \n";
      $c = $a; $a = $b; $b = $c;
      echo "Swapped values a = $a b = $b \n";
   }

   swap_ref($x, $y);
   echo "Actual arguments get changed after the function: \n";
   echo "x = $x y = $y";
?>

Nó sẽ tạo ra output

Actual arguments x = 10 y = 20 

Initial values a = 10 b = 20 
Swapped values a = 20 b = 10 
Actual arguments do not change after the function: 
x = 10 y = 20 

Initial values a = 10 b = 20 
Swapped values a = 20 b = 10 
Actual arguments get changed after the function: 
x = 20 y = 10

Return by Reference

Cũng giống như một hàm trong PHP có thể nhận tham số theo tham chiếu, nó cũng có thể trả về một tham chiếu. Để định nghĩa một hàm trả về một tham chiếu, hãy thêm ký hiệu "&" trước tên của hàm.

Example

Đoạn mã sau đây cho thấy ví dụ về một hàm trả về một tham chiếu. Nó trả về $x , là một biến tĩnh cục bộ bên trong myfunction() . Vì ký hiệu "&" được thêm vào trước nó, $a (biến lưu trữ giá trị trả về) trở thành một tham chiếu đến &x . Do đó, bất kỳ thay đổi nào trong $a cũng sẽ thay đổi giá trị của $x .

<?php
   function &myfunction(){
      static $x=10;
      echo "x Inside function: $x \n";
      return $x;
   }

   $a=&myfunction(); 
   echo "Returned by Reference: $a \n";
   $a=$a+10; 
   $a=&myfunction();
?>

Nó sẽ tạo ra output

x Inside function: 10 
Returned by Reference: 10 
x Inside function: 20