PHP - Gọi theo tham chiếu

Chào mừng các bạn đang học lập trình! Hôm nay, chúng ta sẽ cùng nhau khám phá một chủ đề thú vị trong PHP: Gọi theo tham chiếu. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng bước qua khái niệm này, cũng như tôi đã làm với nhiều học viên trong những năm dạy học của mình. Hãy cùng bắt đầu cuộc phiêu lưu lập trình này nhé!

PHP - Call by Reference

Gọi theo tham chiếu là gì?

Trước khi chúng ta đi vào chi tiết, hãy hiểu xem "Gọi theo tham chiếu" có nghĩa là gì. Trong PHP, khi chúng ta truyền một biến vào một hàm, chúng ta thường truyền giá trị của nó. Điều này được gọi là "Gọi theo giá trị". Tuy nhiên, đôi khi chúng ta muốn truyền chính biến itself, không chỉ giá trị của nó. Đây là lúc "Gọi theo tham chiếu" phát huy tác dụng.

Hãy tưởng tượng bạn có một hộp (biến) chứa một món đồ chơi (giá trị). Khi bạn truyền hộp theo giá trị, bạn đang đưa cho ai đó một bản sao của món đồ chơi. Nhưng khi bạn truyền theo tham chiếu, bạn đang đưa cho họ chính hộp đó. Bất kỳ thay đổi nào họ thực hiện đều ảnh hưởng đến hộp gốc và nội dung của nó.

Ví dụ

Hãy bắt đầu với một ví dụ đơn giản để minh họa khái niệm này:

<?php
function addFive($num) {
$num += 5;
}

$myNumber = 10;
addFive($myNumber);
echo $myNumber; // Output: 10
?>

Trong ví dụ này, chúng ta đang truyền $myNumber theo giá trị. Hàm addFive() cộng 5 vào tham số, nhưng nó không ảnh hưởng đến biến $myNumber ban đầu. Output vẫn là 10.

Bây giờ, hãy thay đổi này để sử dụng gọi theo tham chiếu:

<?php
function addFive(&$num) {
$num += 5;
}

$myNumber = 10;
addFive($myNumber);
echo $myNumber; // Output: 15
?>

Chú ý đến dấu & trước tham số $num. Điều này cho PHP biết để truyền biến theo tham chiếu. Bây giờ, khi chúng ta gọi addFive($myNumber), nó thay đổi biến $myNumber ban đầu, và output là 15.

Gọi hàm PHP theo tham chiếu

Để gọi một hàm theo tham chiếu, chúng ta cần làm hai điều:

  1. Định nghĩa tham số hàm với một & trước nó.
  2. Truyền một biến (không phải giá trị) khi gọi hàm.

Dưới đây là một ví dụ khác:

<?php
function double(&$value) {
$value *= 2;
}

$number = 5;
double($number);
echo $number; // Output: 10

$string = "Hello";
double($string);
echo $string; // Output: HelloHello
?>

Trong ví dụ này, hàm double() hoạt động cả với số và chuỗi. Nó thay đổi biến gốc trong cả hai trường hợp.

Đổi giá trị hai biến

Một ứng dụng phổ biến của gọi theo tham chiếu là đổi giá trị của hai biến. Hãy xem chúng ta có thể làm điều này như thế nào:

<?php
function swap(&$a, &$b) {
$temp = $a;
$a = $b;
$b = $temp;
}

$x = "lemonade";
$y = "iced tea";

echo "Before swap: x = $x, y = $y\n";
swap($x, $y);
echo "After swap: x = $x, y = $y\n";
?>

Output:

Before swap: x = lemonade, y = iced tea
After swap: x = iced tea, y = lemonade

Hàm swap này giống như một phép魔术 - nó làm cho hai biến trao đổi giá trị của chúng! Nếu không có gọi theo tham chiếu, chúng ta sẽ cần phải trả về nhiều giá trị hoặc sử dụng các biến toàn cục, điều này có thể rất rối rắm.

Trả về theo tham chiếu

PHP cũng cho phép các hàm trả về một tham chiếu. Điều này ít phổ biến hơn nhưng có thể hữu ích trong một số tình huống. Dưới đây là một ví dụ:

<?php
function &getLargestNumber(&$numbers) {
$largest = &$numbers[0];
foreach ($numbers as &$number) {
if ($number > $largest) {
$largest = &$number;
}
}
return $largest;
}

$myNumbers = [5, 8, 3, 12, 7];
$largestNumber = &getLargestNumber($myNumbers);
$largestNumber = 100;

print_r($myNumbers);
?>

Output:

Array
(
[0] => 5
[1] => 100
[2] => 3
[3] => 12
[4] => 7
)

Trong ví dụ này, getLargestNumber() trả về một tham chiếu đến số lớn nhất trong mảng. Khi chúng ta thay đổi $largestNumber, nó thực sự thay đổi giá trị trong mảng gốc.

Bảng tóm tắt phương pháp

Dưới đây là bảng tóm tắt các phương pháp chúng ta đã thảo luận:

Phương pháp Cú pháp Mô tả
Gọi theo tham chiếu function myFunc(&$param) Cho phép hàm thay đổi biến gốc
Trả về theo tham chiếu function &myFunc() Trả về một tham chiếu thay vì giá trị
Đổi giá trị hai biến swap(&$a, &$b) Trao đổi giá trị của hai biến

Kết luận

Gọi theo tham chiếu trong PHP giống như đưa cho ai đó chìa khóa của ngôi nhà thay vì chỉ một bức ảnh của nó. Nó rất mạnh mẽ nhưng nên được sử dụng một cách cẩn thận. Nhớ rằng, với quyền lực lớn đi kèm với trách nhiệm lớn!

Trong hành trình học PHP của bạn, bạn sẽ tìm thấy nhiều khái niệm thú vị khác để khám phá. Hãy tiếp tục lập trình, tiếp tục học hỏi, và quan trọng nhất là hãy vui vẻ! Ai biết được, có lẽ một ngày nào đó bạn sẽ là người dạy người khác về phép màu của lập trình.

Credits: Image by storyset