我需要帮助理解这个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(可能是所有其他语言)中是非法的,所以解释器根本不这样做(尽管解释器的正常行为是在函数体中出现的任何地方替换参数。
谢谢
答案 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**