Giới thiệu
Trong PHP , các đối số cho một hàm có thể được truyền bằng giá trị hoặc truyền bằng tham chiếu. Theo mặc định, các giá trị của các đối số thực tế được chuyển theo giá trị cho các đối số chính thức trở thành các biến cục bộ bên trong hàm. Do đó, việc sửa đổi các biến này không làm thay đổi giá trị của biến đối số thực tế.
Khi các đối số được truyền bằng tham chiếu, sự thay đổi về giá trị của đối số chính thức được phản ánh trong biến đối số thực tế vì biến đối số trước là tham chiếu đến đối số sau. Do đó, cơ chế truyền qua tham chiếu giúp thao tác gián tiếp dữ liệu trong không gian toàn cầu. Nó cũng giúp khắc phục thực tế là một hàm chỉ có thể trả về một biến.
Truyền theo giá trị
Trong ví dụ sau, hai biến được chuyển cho hàm swap (). Mặc dù cơ chế hoán đổi diễn ra bên trong hàm, nó không thay đổi giá trị của các biến đã được truyền
Ví dụ
<?php function swap($arg1, $arg2){ echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n"; $temp=$arg1; $arg1=$arg2; $arg2=$temp; echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>
Đầu ra
Ví dụ này cho kết quả sau
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=10 arg2=20
Chuyển qua tài liệu tham khảo
Để nhận đối số bằng tham chiếu, đối số chính thức được sử dụng biến phải có tiền tố là &ký hiệu. Nó tham chiếu đến các biến được sử dụng để gọi hàm. Do đó, kết quả của việc hoán đổi bên trong hàm cũng sẽ được phản ánh trong các biến ban đầu đã được chuyển qua
Ví dụ
<?php function swap(&$arg1, &$arg2){ echo "inside function before swapping: arg1=$arg1 arg2=$arg2\n"; $temp=$arg1; $arg1=$arg2; $arg2=$temp; echo "inside function after swapping: arg1=$arg1 arg2=$arg2\n"; } $arg1=10; $arg2=20; echo "before calling function : arg1=$arg1 arg2=$arg2\n"; swap($arg1, $arg2); echo "after calling function : arg1=$arg1 arg2=$arg2\n"; ?>
Đầu ra
Kết quả hoán đổi sẽ được hiển thị như sau
before calling function : arg1=10 arg2=20 inside function before swapping: arg1=10 arg2=20 inside function after swapping: arg1=20 arg2=10 after calling function : arg1=20 arg2=10
Trong ví dụ sau, phần tử mảng là các tham chiếu đến các biến riêng lẻ được khai báo trước khi khởi tạo mảng. Nếu phần tử được sửa đổi, giá trị của biến cũng thay đổi
Ví dụ
<?php $a = 10; $b = 20; $c=30; $arr = array(&$a, &$b, &$c); for ($i=0; $i<3; $i++) $arr[$i]++; echo "$a $b $c"; ?>
Đầu ra
Giá trị của $ a, $ b và $ c cũng được tăng dần
11 21 31
Cũng có thể chuyển bằng cách tham chiếu một mảng đến một hàm
Ví dụ
<?php function arrfunction(&$arr){ for ($i=0;$i<5;$i++) $arr[$i]=$arr[$i]+10; } $arr=[1,2,3,4,5]; arrfunction($arr); foreach ($arr as $i) echo $i . " "; ?>
Đầu ra
Mảng đã sửa đổi sẽ được hiển thị như sau
11 12 13 14 15
Đối tượng và tham chiếu
Trong PHP, các đối tượng được truyền bởi các tham chiếu theo mặc định. Khi một tham chiếu của đối tượng được tạo, tham chiếu của nó cũng được gửi dưới dạng đối số ở dạng $ this cũng là tham chiếu đến đối tượng đầu tiên
Ví dụ
<?php class test1{ private $name; function getname(){ return $this->name; } function setname($name){ $this->name=$name; } } $obj1=new test1(); $obj2=&$obj1; $obj1->setname("Amar"); echo "name: " .$obj2->getname(); ?>
Đầu ra
Đoạn mã trên sẽ hiển thị kết quả sau
name: Amar