【问题标题】:php global variable not showing correct answerphp全局变量未显示正确答案
【发布时间】:2013-04-20 07:39:03
【问题描述】:

它的代码非常简单,但我不明白这是什么意思:(

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

【问题讨论】:

标签: php function variables global


【解决方案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

代码不仅更易于阅读,而且确定性。调用时它的行为总是相同的。这意味着更少的猜测。

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

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

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

经验教训:

  • 不要在函数中使用全局变量 - 它们只会妨碍您。
  • 减少函数具有的参数数量(大约是所有个传入值,因此全局计数也是如此)。

【讨论】:

  • 所以如果我在 global(within func) 之前定义一个变量,它会是 NULL 吗?
  • 不,$a 是 NULL,因为在全局范围内它是 NULL(默认情况下,在 PHP 中所有未设置的变量都是 NULL)。函数中的global $a 告诉PHP 在函数内部的全局范围内使用$a。因此,曾经的局部变量现在具有全局变量(NULL)的值。
  • 此外,您不应该仅仅想知道为什么会发生这种情况,还应该关注一个更重要的问题:为什么您需要这里有一个全局变量?
  • 是的,我知道,何时使用 global 变量,但我在模拟测试中得到了这个问题,然后我发布了这个问题。
【解决方案2】:

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

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

由于$a 未在您的第一个示例中定义,$GLOBALS["a"] 的计算结果为null,因此$a 正在成为对持有null 值的变量的引用。

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

(P.s.:实际上它是对主范围内的变量进行直接引用。)

【讨论】:

    【解决方案3】:
    in php a variable Scope priority is 
     1- local variable
     2- global variable
    

    即使你在函数体中确定了全局 $a,但在它出现时使用了局部变量 $a。 参考Php variable reference 如果您想使用与本地变量同名的全局变量,您必须使用 $GLOBALS['c']=$GLOBALS['a']+$b;如果 $c 和 $a 是全局定义 希望对您有所帮助

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 即使 $a 在全局范围内未定义,global 关键字也会在本地范围内定义它,因此您不会看到该警告。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多