PHP - 傳址呼叫

歡迎,有志於成為程序員的各位!今天,我們將深入探討PHP中的一個令人興奮的主題:傳址呼叫。別擔心如果你是編程新手;我會一步步地引導你了解這個概念,正如我這些年來為許多學生所做的一樣。讓我們一起踏上這次編碼冒險吧!

PHP - Call by Reference

傳址呼叫是什麼?

在我們深入細節之前,讓我們先了解「傳址呼叫」是什麼意思。在PHP中,當我們將一個變量傳遞給函數時,我們通常傳遞的是它的值。這被稱為「傳值」。然而,有時我們想要傳遞變量本身,而不仅仅是它的值。這就是「傳址呼叫」派上用場的地方。

想像你有一個裝有玩具的盒子(變量)。當你按值傳遞盒子時,你是在給別人一個玩具的副本。但是當你按引用傳遞時,你是在給他們盒子本身。他們所做的任何改動都會影響原始的盒子和它的內容。

示例

讓我們從一個簡單的例子開始,以說明這個概念:

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

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

在這個例子中,我們按值傳遞了$myNumberaddFive()函數將5加到參數上,但它不會影響原始的$myNumber變量。輸出仍然為10。

現在,讓我們修改這個例子以使用傳址呼叫:

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

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

注意參數$num前的&。這告訴PHP按引用傳遞變量。現在,當我們調用addFive($myNumber)時,它會修改原始的$myNumber,輸出為15。

按引用調用PHP函數

要按引用調用函數,我們需要做兩件事:

  1. 在定義函數參數時在其前面加上&
  2. 在調用函數時傳遞一個變量(而不是值)。

這裡有另一個例子:

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

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

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

在這個例子中,我們的double()函數對數字和字符串都有效。它在兩種情況下都修改了原始變量。

交換兩個變量的值

傳址呼叫的一個常見用途是交換兩個變量的值。讓我們看看如何做到這一點:

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

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

echo "交換前:x = $x, y = $y\n";
swap($x, $y);
echo "交換後:x = $x, y = $y\n";
?>

輸出:

交換前:x = lemonade, y = iced tea
交換後:x = iced tea, y = lemonade

這個交換函數就像魔術師的戲法一樣——它讓兩個變量交換他們的值!沒有傳址呼叫,我們可能需要返回多個值或使用全局變量,這會變得很亂。

按引用返回

PHP還允許函數按引用返回。這個用法較不常見,但在某些情況下很有用。這裡有一個例子:

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

輸出:

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

在這個例子中,getLargestNumber()返回對數組中最大數字的引用。當我們修改$largestNumber時,它實際上會改變原始數組中的值。

方法總結

這裡是一個總結我們討論過的方法的表格:

方法 語法 描述
按引用傳遞 function myFunc(&$param) 讓函數能夠修改原始變量
按引用返回 function &myFunc() 返回引用而不是值
交換變量 swap(&$a, &$b) 交換兩個變量的值

結論

PHP中的傳址呼叫就像給別人你的房子的鑰匙而不是房子的照片一樣。它很強大,但應該謹慎使用。記住,能力越強,責任越大!

在你繼續你的PHP旅程時,你會發現更多令人興奮的概念等待你去探索。持續編碼,持續學習,最重要的是,享受樂趣!誰知道,也許有一天你會成為教導他人編程魔法的那个人。

Credits: Image by storyset