2016-09-15 125 views
3
<?php 
function sum($y) { 
$y = $y + 5; 
} 

$x = 5; 
sum($x); 
echo $x; 
?> 

所以我有這個代碼。問題是:它輸出了什麼?答案:5.我怎樣才能輸出10?答案:總和(& $ x)。通過引用傳遞與值傳遞

問題是我不明白爲什麼第一個問題的答案是5.當你做sum($ x)時,它不應該用$ x代替函數,所以$ x = 5 + 5 = 10?爲什麼答案是5?我真的不明白。有人向我解釋了一些與指針和地址有關的東西,但我不明白。我從來沒有理解指針的概念,我GOOGLE了它,顯然在PHP中沒有指針,所以我超級困惑。我的朋友說,一個變量是由一個值和內存地址組成的。有人能像我5歲那樣解釋我爲什麼答案是5而不是10?請

+0

的'價值$ X + 5'不放回'$ x'而是轉換成'$ y',它只存在於'sum($ y)'函數的範圍內。 – x13

+0

但爲什麼會發生?我知道我的問題真的很愚蠢。我的意思是,sum($ x)不是$ x = $ x + 5?爲什麼它回到$ y?總和($ x)是否意味着用$ x替換$ y? –

+2

默認情況下,它會創建'sum'($ y)'函數中使用的名爲'$ y'的'$ x'的'重複',此時'$ x'和'$ y'除了巧合)他們的價值。 '$ y'增加了5,但'$ x'在任何地方都沒有提及。如果你把'$ y'作爲'sum(&$ y)'放在參數列表中,它不會創建一個新的重複,而是引用'$ x'。這是在用戶的電話號碼上寫下某個人的電話號碼和寫在郵箱上的區別,你可以找到他們的電話號碼。 – x13

回答

7

讓我們假裝$x是一張寫有5的紙。

function sum($y) { 
    $y = $y + 5; 
} 

這裏$y是你寫什麼。你在腦海中添加5個這樣的值,但是音符保持不變。

function sum(&$y) { 
    $y = $y + 5; 
} 

隨着參考運算符(&$y),你通過非常紙的功能,它會覆蓋什麼的寫在上面。


對於喜歡數字的原始值,我不會理會,始終return值你想要的:

function valuePlusFive($x) { 
    return $x + 5; 
} 

$x = 5; 
$x = valuePlusFive($x); 
+1

ELI5經過驗證的答案,我喜歡它 – Neat

+0

現在它是有道理的,你和第二個評論真的讓我明白,謝謝! –

5

這不是但從理論的角度很好的解釋,但這應該幫助你理解這個概念:

在聲明函數像這樣,然後調用它:

function ($argument) {...} 

的你在那裏傳遞的論點是通過價值傳遞的。這意味着在函數範圍內,您將使用您傳遞的參數的副本。你可以想象,在函數被調用之前,已經創建了參數的副本,並且在你使用該副本的函數內部,而原始的仍然未被觸及。一旦該功能完成副本不再是

然而,當你聲明它是這樣的:

function (&$argument) {...} 

你是通過引用傳遞參數,意味着您直接與你度過了一個可變的工作。因此,在這種情況下,不會創建副本,您從一個地方獲取參數,將其放入函數中並對其進行更改。

+1

我不知道這是一個副本。謝謝! –

3

在PHP中,「變量的範圍是其定義的上下文。」 (according to the docs)。因此,在你的函數中,$y(你傳入的值的一個副本)正在被操作,但它不會被函數返回。所以當函數結束時,該值不能在函數外部訪問。當你調用這個代碼

function sum(&$y) { 
    $y = $y + 5; 
} 

現在:

$x = 5; 
sum($x); 
echo $x; 

它將輸出

如果你想pass the variable in by reference(類似於C的指針),那麼你可以添加&像這樣10.也許更好的方法是從函數返回一個值,並輸出該值:

function sum($y) { 
    return $y + 5; 
} 

$x = 5; 
echo sum($x);