php函数返回值意外

时间:2011-08-08 16:20:38

标签: php function

我需要帮助理解这个PHP代码示例:

$bar = "outside";
function foo($bar) {
  $bar = "inside";
  return $bar;
}
$bar = foo($bar);
echo $bar

我预测$ bar会回应“外部”,但它回应“内部”,我不明白为什么。 $ bar最初的值为“outside”(定义为全局)。然后调用函数foo(在它定义之后),并获取一个参数,也恰好称为$ bar。 $ bar的值为“outside”,因此值“outside”传递给foo。然后我们有声明$ bar =“inside”,这对我没有意义,因为它似乎意味着“outside”=“inside”,你怎么能将字符串分配给另一个字符串?然后函数返回$ bar,我认为它应该具有值“outside”,因为那是传递给foo的。如何获得“内部”的价值我无法弄清楚。

编辑:我的问题与变量范围无关。我想知道的是为什么参数值没有被传递给第3行的函数,给出了无意义的语句“outside”=“inside”。基于我得到的答案,我只能假设它是因为这样的声明在PHP(可能是所有其他语言)中是非法的,所以解释器根本不这样做(尽管解释器的正常行为是在函数体中出现的任何地方替换参数。

谢谢

3 个答案:

答案 0 :(得分:1)

您的专线$bar = "inside";正在重新分配$bar的值。因此,无论您传入什么值,$bar都会被赋值"inside"

答案 1 :(得分:1)

好吧,我不是PHP专家,但是我使用过其他几种语言,所以让我采取刺激措施:

当函数开始执行时,变量$ bar是函数的本地函数(你没有引用第3行的全局$ bar)。您将此局部变量设置为“内部”并返回它。然后将全局$ bar设置为返回值“inside”。

如果将函数声明更改为:

,则可以看到此工作
function foo($bid) {
    $bid = "inside";
    return $bid;
}

基于您在其他问题上发表的评论,我想添加一些内容:

当您在代码中的某处看到“$ bid”时,发生的变化不是变量替换,而是变量评估。如果等号位于此“评估”的右侧,则编译器知道“不评估,设置”。而当等号出现在变量的左侧时,则对其进行评估。当变量位于等号的左侧或右侧时,编译器会以不同的方式知道函数。

答案 2 :(得分:0)

1:

$bar = "outside";
function foo($bar) {
    $bar = "inside";
    return $bar;
}
$bar = foo($bar);
echo $bar // **echo's inside**

2:

$bar = "outside";
function foo($bar) {
    GLOBAL $bar;
    $bar = "inside";
    return $bar;
}
$bar = foo($bar);
echo $bar  // **echo's inside**

3:

$bar = "outside";
function foo($bar) {

  $bar = "inside";
  GLOBAL $bar;
  return $bar;
}
$bar = foo($bar);
echo $bar //  **echo's outside**