PHP - 傳值呼叫:初学者的友好指南

你好,未來的PHP巨星!我很興奮能成為你進入PHP編程世界的引路人。今天,我們將深入一個基本概念——「傳值呼叫」。別擔心這聽起來有點令人生畏——我保證我們會將其分解成易於消化的片段!

PHP - Call by value

什麼是「傳值呼叫」?

在我們跳進代碼之前,讓我們先了解「傳值呼叫」的意思。想像你有一張菜譜卡片,上面寫有指示。當你將這張菜譜分享給朋友時,你並不是給他們你的原始卡片——你製作了一份副本。這樣,如果他們不慎將醬汁灑在上面或進行更改,你的原始菜譜仍然安全。這就是「傳值呼叫」在編程中做的事情!

在PHP中,當你使用「傳值呼叫」將變量傳遞給函數時,函數接收的是變量值的副本,而不是原始變量本身。這意味著在函數內對變量所做的任何更改都不會影響函數外部原始變量。

現在,讓我們通過一些示例來看看這是怎麼工作的!

示例 1:生日蛋糕

我們從一個簡單的例子開始。想像我們正在烘烤一個生日蛋糕,並想添加蠟燭:

function addCandles($age) {
$age = $age + 1;
echo "在函數內部:$age 支蠟燭\n";
}

$myAge = 25;
echo "在函數外部:$myAge 歲\n";
addCandles($myAge);
echo "在函數之後:$myAge 歲\n";

如果你運行這段代碼,你會看到:

在函數外部:25 歲
在函數內部:26 支蠟燭
在函數之後:25 歲

這裡發生了什麼?讓我們分解一下:

  1. 我們從 $myAge 設為 25 開始。
  2. 我們調用了 addCandles 函數,傳遞了 $myAge
  3. 在函數內部,我們將 $age(這是 $myAge 的副本)加 1。
  4. 函數打印出 26 支蠟燭。
  5. 在函數外部,$myAge 仍然是 25!

這就是「傳值呼叫」在行動。函數使用 $myAge 的副本進行操作,所以原始變量保持不變。

示例 2:購物清單

讓我們再試一個例子。這次,我們將使用一個購物清單:

function addItem($list, $item) {
$list[] = $item;
echo "在函數內部:" . implode(", ", $list) . "\n";
}

$myList = ["apples", "bananas"];
echo "在函數外部:" . implode(", ", $myList) . "\n";
addItem($myList, "oranges");
echo "在函數之後:" . implode(", ", $myList) . "\n";

運行這段代碼將給你:

在函數外部:apples, bananas
在函數內部:apples, bananas, oranges
在函數之後:apples, bananas

這裡發生了什麼?

  1. 我們從包含蘋果和香蕉的購物清單開始。
  2. 我們調用 addItem,傳遞我們的清單和 "oranges"。
  3. 在函數內部,"oranges" 被添加到清單的副本中。
  4. 函數顯示更新後的清單,其中包括了 oranges。
  5. 在函數外部,我們原始的購物清單保持不變!

再一次,「傳值呼叫」確保我們原始的購物清單沒有被修改。

示例 3:數字翻倍

讓我們再看一個例子,以確實掌握這個概念:

function doubleNumber($num) {
$num *= 2;
echo "在函數內部:$num\n";
return $num;
}

$myNumber = 5;
echo "在函數外部:$myNumber\n";
$result = doubleNumber($myNumber);
echo "函數返回:$result\n";
echo "在函數之後:$myNumber\n";

這將輸出:

在函數外部:5
在函數內部:10
函數返回:10
在函數之後:5

讓我們分析一下:

  1. 我們從 $myNumber 為 5 開始。
  2. 我們調用 doubleNumber,傳遞 $myNumber
  3. 在函數內部,我們將數字的副本翻倍,變成 10。
  4. 函數返回這個翻倍後的值。
  5. 在函數外部,$myNumber 還是 5,但我們在 $result 中有翻倍後的結果。

這個例子顯示,即使函數返回一個值,傳遞給它的原始變量由於「傳值呼叫」而保持不變。

為什麼「傳值呼叫」很重要?

你可能會想,「我們為什麼需要這個?」其實,「傳值呼叫」對於在程序中保持數據完整性至關重要。它防止了函數意外修改它們不應該修改的變量,這可能導致意外的錯誤和難以追蹤的問題。

想像一下,如果你每次借書給朋友,他們都能不小心(或故意)改變故事!那會是個混亂的世界!「傳值呼叫」就像給他們一張影印件一樣——他們可以隨意做筆記,但你的原始書籍保持完好無損。

快速參考表

這裡有一個方便的表格,總結了我們學到的關於PHP中的「傳值呼叫」:

方面 描述
定義 函數接收變量值的副本
原始變量 函數調用後保持不變
函數參數 函數內部可以修改,而不影響原始變量
使用案例 保持數據完整性,防止意外的副作用
記憶體 創建新的副本,對於大型數據結構可能會使用更多記憶體

總結

恭喜你!你剛剛踏出了理解PHP中「傳值呼叫」的第一步。記住,這個概念就像在將變量交給函數之前先為它製作一份影印件。函數可以在那份副本上亂畫,但你的原始變量保持安全無虞。

在你繼續你的PHP之旅時,你會遇到更複雜的情節,甚至會學習到它的對立面,「傳引用呼叫」。但現在,給自己一個鼓勵——你已經掌握了一個將會在你的編程冒險中為你提供良好服務的基本概念!

繼續編程,保持好奇心,並記住——在PHP的世界裡,你的變量就像你珍貴的菜譜。 「傳值呼叫」確保它們不會意外地添加任何未經許可的成分!

Credits: Image by storyset