php全局变量未显示正确答案

时间:2013-04-20 07:39:04

标签: php function variables global

它非常简单的代码,但我不明白这一点:(

function aaa($b){
$a = 30;
global $a,$c;
return $c=($b+$a);}
echo aaa(40); //Output is 40

为什么输出为40?当我在功能之外调用$ a时,它给了我想要的答案,那么重点是什么?

$a = 30;
function aaa($b){
global $a,$c;
return $c=($b+$a);
}
echo aaa(40); //Output is 70


function aaa($b){
global $a,$c;
$a = 30;
return $c=($b+$a);
}
echo aaa(40); //Output is 70

4 个答案:

答案 0 :(得分:1)

查看global关键字代表的内容:

function aaa($b) {
    $a = 30;               # local variable, will be overwritten just in the next line
    global $a, $c;         # importing $a from the global scope - NULL
    return $c = ($b + $a); # $c = (40 + NULL)
}

http://php.net/global上的手册提醒全局变量如果在那里使用它会影响函数。这不仅适用于第一次通话,也适用于所有后续通话。

这使得函数不确定,因此代码不太有用,你可能 - 正如你刚才所做的那样 - 对它感到恼火。

一个简单的方法是:不要将该函数的参数值放入全局变量,而是将它们转换为参数:

function aaa($a, $b, &$c) {
    return $c = ($b + $a);
}

echo aaa(30, 40, $c); //Output is 70

代码不仅更容易阅读,而且 deterministic 。调用时它的行为始终相同。这意味着更少的猜测。

此示例仍然存在通过参数(通过引用)返回值的问题,但是您可能也会看到这不再是必需的:

function aaa($a, $b) {
    return ($b + $a);
}

echo $c = aaa(30, 40); //Output is 70

要带走的教训:

  • 不要在函数内部使用全局变量 - 它们只会妨碍你。
  • 减少一个函数的参数个数(大约是所有的值,所以全局计数也是如此)。

答案 1 :(得分:1)

当使用例如global $a;时,PHP会覆盖变量$a并为其分配引用,就好像此语句被替换为:

$a = &$GLOBALS["a"]; // and the same with every other variable which is used in global

由于第一个示例中未定义$a$GLOBALS["a"]评估为null,因此$a正在成为对{{1}的变量的引用价值。

在函数调用之前和之后尝试null。它将在函数调用后显示一个名为var_dump($GLOBALS);的新索引(值为a或您为其指定的值)。

(P.s。:实际上它正在直接引用主范围中的变量。)

答案 2 :(得分:0)

in php a variable Scope priority is 
 1- local variable
 2- global variable

即使您确定函数体中的全局$ a,但是当它在apear时使用局部变量$ a。    参考Php variable reference 如果要使用与本地变量同名的全局变量,则必须使用    $ GLOBALS [ 'C'] = $ GLOBALS [ '一'] + $ B;如果$ c和$ a是全局定义 希望这个帮助

答案 3 :(得分:0)

我认为,在第一种情况下,$ a未定义。首先写入$ a然后调用函数的值。在页面顶部使用error_reporting(E_ALL)来了解脚本中的错误。