通过引用传递与值传递

问题描述:

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

让我们假装$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

现在它是有道理的,你和第二个评论真的让我明白,谢谢! –

这不是但从理论的角度很好的解释,但这应该帮助你理解这个概念:

在声明函数像这样,然后调用它:

function ($argument) {...} 

的你在那里传递的论点是通过价值传递的。这意味着在函数范围内,您将使用您传递的参数的副本。你可以想象,在函数被调用之前,已经创建了参数的副本,并且在你使用该副本的函数内部,而原始的仍然未被触及。一旦该功能完成副本不再是

然而,当你声明它是这样的:

function (&$argument) {...} 

你是通过引用传递参数,意味着您直接与你度过了一个可变的工作。因此,在这种情况下,不会创建副本,您从一个地方获取参数,将其放入函数中并对其进行更改。

+1

我不知道这是一个副本。谢谢! –

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