通过引用传递与通过值传递

时间:2016-09-15 13:23:42

标签: php reference

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

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

所以我有这个代码。问题是:它输出了什么?答案:5。如何输出10?答案:总和(&amp; $ x)。

问题是我不明白为什么第一个问题的答案是5.当你做总和($ x)时,不应该用$ x替换函数,所以$ x = 5 + 5 = 10?为什么答案是5?我真的不明白。有人解释了与指针和地址相关的东西,但我不明白。我从来没有理解指针的概念,我用谷歌搜索它,显然在PHP中没有指针,所以我非常困惑。我的朋友说变量是由一个值和该值的内存地址组成的。有人可以解释我,就像我5岁,为什么答案是5而不是10?请

3 个答案:

答案 0 :(得分: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 :(得分:5)

从理论的角度来看,这不是一个很好的解释,但这应该有助于你理解这个概念:

当你声明这样的函数然后调用它时:

function ($argument) {...}

您传递的参数是按值传递的。这意味着在函数范围内,您将使用传递的参数的副本。您可以想象,在调用函数之前,已经创建了参数的副本,并且在函数内部使用了副本,而原始文件保持不变。功能完成后,副本不再是

但是当你声明它时:

function (&$argument) {...}

您正在通过引用传递参数,这意味着您正在使用已经传递的变量。因此,在这种情况下,不会制作副本,您从一个地方获取参数,将其放在函数内并更改它。

答案 2 :(得分:3)

在PHP中,“变量的范围是定义它的上下文。” (according to the docs)。因此,在函数内部,$y(传入的值的副本)正在被操作,但函数不会返回它。因此,当函数结束时,函数外部不再可以访问该值。

如果您想要pass the variable in by reference(类似于C中的指针),那么您可以像这样添加&

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

现在,当您调用此代码时:

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

它将输出10.也许更好的方法是从函数返回一个值,并输出该值:

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

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