2011-08-08 79 views
1

我需要帮助理解这个PHP代码示例:PHP函数的返回值意外

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

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

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

谢谢

+1

这是(举例)说明如下:[可变范围](HTTP:// PHP。 net/manual/en/language.variables.scope.php) - 你需要先理解它才能使用它,这是跨越许多计算机语言的一个非常基本的原则。 – hakre

+0

你应该更清楚你需要什么功能。 –

+0

@hakre:我的问题不需要处理变量作用域。我理解范围足以处理这个问题。如果我的困惑正在出现,那么为什么参数值“outside”不会替代第3行上的局部变量$ bar,这种参数值通常被替换的方式。换句话说,我似乎偶然发现一个参数值没有传入函数的情况。 – Bill

回答

1

你行$bar = "inside";重新分配的$bar值。所以,无论您传递什么值,$bar都会被分配值"inside"

+0

是的,但不是在函数内的第3行替换到局部变量$ bar的“外部”值?这就创造了“外部”=“内部”的说法,这让我感到困惑。 – Bill

+0

不,分配运算符('=')左侧的变量始终位于赋值的接收端 - 不计算,仅重新赋值。 –

1

嗯,我没有PHP的专家,但我已经与一些其他语言的工作这么让我带刺:

当函数开始执行变量$酒吧是当地的功能(你”请勿在第3行中引用全局$栏)。您将此局部变量设置为“内部”并将其返回。然后,全局$ bar被设置为返回值“inside”。

如果你改变了函数声明你可以看到这个工作:

function foo($bid) { 
    $bid = "inside"; 
    return $bid; 
} 
基于你已经张贴在其他问题的意见

我想补充一点:当你看到

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

+0

是的,但我仍然对传入函数的值发生了什么感到困惑。 “外部”传递给foo,那么这不是说“外部”替换foo内的任何$ bar(或$ bid)事件吗?这给了令人困惑的赋值语句“outside”=“inside”;在线3. – Bill

+1

不,不完全。 PHP以及其他语言的工作并不像这样。它不是像代数中所看到的价值取代。第三行的意思是“将变量$ bar设置为'inside'',而不是'将'outside'设置为'inside'” –

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