Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Truyền tham chiếu (Passing by Reference) trong PHP

Giới thiệu

Trong PHP, argument truyền cho function có thể pass by value hoặc pass by reference. Mặc định, giá trị actual argument truyền by value cho formal argument trở thành biến local trong function. Do đó, sửa đổi biến này không thay đổi giá trị actual argument variable.

Khi truyền bằng tham chiếu, thay đổi giá trị formal argument phản ánh ra actual argument variable vì formal argument là reference đến actual argument. Cơ chế pass by reference giúp thao tác gián tiếp dữ liệu trong global space. Cũng giúp khắc phục hạn chế function chỉ return một biến.

Truyền bằng giá trị (Pass by Value)

<?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";
?>

Kết quả

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

Truyền bằng tham chiếu (Pass by reference)

Để nhận argument bằng tham chiếu, formal argument tiền tố &. Nó tạo reference đến variable dùng gọi function. Kết quả swap trong function cũng phản ánh ra variable gốc.

<?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";
?>

Kết quả

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

Phần tử mảng là reference

<?php
$a = 10; $b = 20; $c = 30;
$arr = array(&$a, &$b, &$c);
for ($i = 0; $i < 3; $i++) $arr[$i]++;
echo "$a $b $c";
?>

Kết quả

11 21 31

Truyền mảng bằng tham chiếu

<?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 . " ";
?>

Kết quả

11 12 13 14 15

Object và reference

Trong PHP, object được truyền bằng reference mặc định. Khi tạo reference của object, reference của nó cũng được gửi như argument dưới dạng $this (cũng là reference đến object đầu tiên).

<?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();
?>

Kết quả

name: Amar