PHP - Gọi theo giá trị: Hướng dẫn thân thiện cho người mới bắt đầu

Xin chào các siêu sao PHP tương lai! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình đầy thú vị vào thế giới lập trình PHP. Hôm nay, chúng ta sẽ cùng tìm hiểu một khái niệm cơ bản gọi là "Gọi theo giá trị". Đừng lo lắng nếu nó听起来 có vẻ đáng sợ - tôi承诺 sẽ chia nhỏ nó thành những phần dễ nuốt!

PHP - Call by value

Gọi theo giá trị là gì?

Trước khi chúng ta nhảy vào mã, hãy hiểu xem "Gọi theo giá trị" nghĩa là gì. Hãy tưởng tượng bạn có một phiếu công thức với các hướng dẫn. Khi bạn chia sẻ công thức này với bạn bè, bạn không cho họ phiếu gốc của bạn - bạn làm một bản sao. Bằng cách này, nếu họ không may đổ nước sốt lên nó hoặc thay đổi nó, công thức gốc của bạn vẫn an toàn. Đó chính là điều "Gọi theo giá trị" làm trong lập trình!

Trong PHP, khi bạn truyền một biến vào một hàm bằng cách "Gọi theo giá trị", hàm nhận được một bản sao của giá trị biến, không phải biến gốc itself. Điều này có nghĩa là bất kỳ thay đổi nào được thực hiện đối với biến trong hàm không ảnh hưởng đến biến gốc ngoài hàm.

Bây giờ, hãy cùng xem điều này trong hành động với một số ví dụ!

Ví dụ 1: Bánh sinh nhật

Hãy bắt đầu với một ví dụ đơn giản. Hãy tưởng tượng chúng ta đang nướng một chiếc bánh sinh nhật và chúng ta muốn thêm nến:

function addCandles($age) {
$age = $age + 1;
echo "Inside the function: $age candles\n";
}

$myAge = 25;
echo "Before the function: $myAge years old\n";
addCandles($myAge);
echo "After the function: $myAge years old\n";

Nếu bạn chạy đoạn mã này, đây là những gì bạn sẽ thấy:

Before the function: 25 years old
Inside the function: 26 candles
After the function: 25 years old

Điều gì đã xảy ra ở đây? Hãy phân tích:

  1. Chúng ta bắt đầu với $myAge được đặt là 25.
  2. Chúng ta gọi hàm addCandles, truyền $myAge.
  3. Trong hàm, chúng ta thêm 1 vào $age (đây là một bản sao của $myAge).
  4. Hàm in ra 26 nến.
  5. Ngoài hàm, $myAge vẫn là 25!

Đây là "Gọi theo giá trị" trong hành động. Hàm đã làm việc với một bản sao của $myAge, vì vậy biến gốc vẫn không thay đổi.

Ví dụ 2: Danh sách mua sắm

Hãy thử một ví dụ khác. Lần này, chúng ta sẽ làm việc với một danh sách mua sắm:

function addItem($list, $item) {
$list[] = $item;
echo "Inside function: " . implode(", ", $list) . "\n";
}

$myList = ["apples", "bananas"];
echo "Before function: " . implode(", ", $myList) . "\n";
addItem($myList, "oranges");
echo "After function: " . implode(", ", $myList) . "\n";

Chạy đoạn mã này sẽ cho bạn:

Before function: apples, bananas
Inside function: apples, bananas, oranges
After function: apples, bananas

Điều gì đang xảy ra ở đây?

  1. Chúng ta bắt đầu với một danh sách mua sắm chứa táo và chuối.
  2. Chúng ta gọi addItem, truyền danh sách của chúng ta và "oranges".
  3. Trong hàm, "oranges" được thêm vào bản sao của danh sách.
  4. Hàm hiển thị danh sách đã cập nhật với oranges.
  5. Ngoài hàm, danh sách gốc của chúng ta vẫn không thay đổi!

Lại một lần nữa, "Gọi theo giá trị" đảm bảo rằng danh sách mua sắm gốc của chúng ta không bị thay đổi.

Ví dụ 3: Nhân đôi số

Hãy xem một ví dụ cuối cùng để really cố định khái niệm này:

function doubleNumber($num) {
$num *= 2;
echo "Inside function: $num\n";
return $num;
}

$myNumber = 5;
echo "Before function: $myNumber\n";
$result = doubleNumber($myNumber);
echo "Function returned: $result\n";
echo "After function: $myNumber\n";

Điều này sẽ đầu ra:

Before function: 5
Inside function: 10
Function returned: 10
After function: 5

Hãy phân tích điều này:

  1. Chúng ta bắt đầu với $myNumber là 5.
  2. Chúng ta gọi doubleNumber, truyền $myNumber.
  3. Trong hàm, bản sao của số được nhân đôi thành 10.
  4. Hàm trả về giá trị đã nhân đôi.
  5. Ngoài hàm, $myNumber vẫn là 5, nhưng chúng ta có kết quả đã nhân đôi trong $result.

Ví dụ này cho thấy rằng ngay cả khi một hàm trả về một giá trị, biến gốc truyền vào vẫn không bị ảnh hưởng do "Gọi theo giá trị."

Tại sao "Gọi theo giá trị" lại quan trọng?

Bạn có thể tự hỏi, "Tại sao chúng ta cần điều này?" "Gọi theo giá trị" rất quan trọng để duy trì tính toàn vẹn dữ liệu trong các chương trình của bạn. Nó ngăn không cho các hàm vô tình thay đổi các biến mà chúng không nên, điều này có thể dẫn đến các lỗi không mong muốn và các vấn đề khó theo dõi.

Hãy tưởng tượng nếu mỗi lần bạn cho một người bạn mượn một cuốn sách, họ có thể vô tình (hoặc cố ý) thay đổi cốt truyện! Đó sẽ là hỗn loạn! "Gọi theo giá trị" giống như việc bạn cho họ một bản photo - họ có thể viết tất cả các ghi chú họ muốn, nhưng cuốn sách gốc của bạn vẫn nguyên vẹn.

Bảng tham khảo nhanh

Dưới đây là bảng tóm tắt những gì chúng ta đã học về "Gọi theo giá trị" trong PHP:

Mặt hàng Mô tả
Định nghĩa Hàm nhận một bản sao của giá trị biến
Biến gốc Không thay đổi sau khi gọi hàm
Tham số hàm Có thể thay đổi trong hàm mà không ảnh hưởng đến biến gốc
Trường hợp sử dụng Duy trì tính toàn vẹn dữ liệu, ngăn chặn các hiệu ứng phụ không mong muốn
Bộ nhớ Tạo một bản sao mới, có thể sử dụng nhiều bộ nhớ hơn cho các cấu trúc dữ liệu lớn

Kết luận

Chúc mừng! Bạn đã刚刚 bước đầu hiểu về "Gọi theo giá trị" trong PHP. Nhớ rằng khái niệm này giống như việc tạo một bản photo của biến trước khi truyền nó cho một hàm. Hàm có thể vẽ vời lên bản photo, nhưng biến gốc của bạn vẫn an toàn và nguyên vẹn.

Khi bạn tiếp tục hành trình PHP của mình, bạn sẽ gặp nhiều tình huống phức tạp hơn và thậm chí học về đối tác của nó, "Gọi theo tham chiếu". Nhưng hiện tại, hãy tự động viên bản thân - bạn đã lĩnh hội một khái niệm cơ bản sẽ phục vụ bạn tốt trong các cuộc phiêu lưu lập trình của mình!

Tiếp tục mã hóa, giữ sự tò mò, và nhớ - trong thế giới PHP, các biến của bạn giống như những công thức quý giá của bạn. "Gọi theo giá trị" đảm bảo rằng chúng không bị thêm bất kỳ thành phần không mong muốn nào!

Credits: Image by storyset