它非常简单的代码,但我不明白这一点:(
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
答案 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)来了解脚本中的错误。