为什么回声$var是不同的


Why echo $var is different

<?php
function f(& $var){$var = rand(); return $var;}
echo f($var ="a_").'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /*but don't change global variables, it still is "1<br/>", no the same like up line */
echo f($var).'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /* haved change, the same like up line */
?>

运行代码并输出文本,如在块下

28486
一个_
25863
25863

为什么第一次调用时无法更改$var

<?php
function f(& $var, & $isRefer){$var = rand(); global $gVar; var_dump(array('are they same?' => $isRefer === $gVar)); return $var;}
$gVar = 'global var';
echo f($var ="a_", $gVar = & $gVar).'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /*but don't change global variables, it still is "1<br/>", no the same like up line */
echo f($var, $gVar).'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /* haved change, the same like up line */
?>
-

代码输出如-

数组(1( { ["它们是一样的吗?=> 布尔(真( } 14802 一个_ 数组(1( { ["它们是一样的吗?=> 布尔(真( } 19107 19107

所以我认为它是通过"引用"传递值f($var = 'd')

通过引用传递变量是函数调用的特例。通常,只有表达式的值作为参数传递到函数中。

f(3 * 4);

这里3 * 4是一个计算结果为 12 的表达式,因此12被传递到函数中。期望通过引用传递变量的函数是不同的,因为它需要一个变量

function f(&$var) { ... }

通过引用传递的目的是能够修改传递的变量,而不仅仅是一个值。因此,您需要实际向其传递一个变量,而不仅仅是一个值。在这种情况下,使用 f(3 * 7) 之类的东西调用函数没有多大意义。嗯,f($var = 'foo')是一回事。 $var = 'foo'是一个表达式,它不仅仅是一个变量。因此,只传递表达式的结果(值(,而不传递碰巧出现在表达式中的任何变量。

为了更好地说明这一点,在执行f($foo + $bar)时应该传递哪个变量?答案是它只是不能那样工作。要通过引用传递变量,只能使用变量作为参数,而不能使用表达式。

f($var);
f($var ="a_");

不会将$var作为参数传递给 f((,而是将该赋值的结果传递给 f((...这是一个未分配的字符串值,等于已分配 tp $var的字符串(假设分配成功(,但不是对$var本身的引用。这就是为什么分配$var,但不被 f(( 更改的原因

这个问题

让我感到困惑。

所以这是你的初始代码:

<?php
function f(& $var){
    $var = rand();
    return $var;
}
echo f($var ="a_").'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /*but don't change global variables, it still is "1<br/>", no the same like up line */
echo f($var).'<br/>'; /* outpu a random number */
echo $var.'<br/>'; /* haved change, the same like up line */
?>

在你的函数中,我传递给它什么并不重要,因为第二行$var = rand();总是会覆盖你传递给函数的任何值。

因此,如果我在第一行之后f("jordanmoore");,这将不再是"jordanmoore",而是一个随机值。

接下来是这一行:echo f($var ="a_").'<br/>'; /* outpu a random number */

我不确定你为什么要在这里设置$var。如果要将"a_"传递给函数,则只需调用f("a_"); 。但是我不确定为什么在值总是被覆盖时将任何东西传递给函数。如果您希望格式为"a_somerandomnumber",那么也许echo "a_".f(null);更好使用?

我将在这里犹豫猜测并将您的函数重写为以下内容

<?php
function f(& $var=null){
    $var = rand();
    return $var;
}
?>

然后你可以像这样使用它:

<?php
function f(& $var=null){
    $var = rand();
    return $var;
}
echo f(); //output a random number
echo "a_".f(); //out put a_ with a random number after the underscore
$myRandomVariable = f(); //put a random number in a variable
echo $myRandomVariable; //echo this variable
echo "a_".$myRandomVariable; //echo this variable after a_
echo "a_$myRandomVariable"; //same as above
?>

希望这有帮助。

编辑

然后,您还可以执行以下操作:

<?php
function f(& $var=null){
    $var = rand();
    return $var;
}
$myValue = 0;
f($myValue); //store a random number in "$myValue"
echo $myValue; //echo the random number
?>