在PHP中访问全局变量的问题

时间:2010-02-18 17:55:24

标签: php global-variables

以下是代码段:

function something() {
$include_file = 'test.php';
if ( file_exists($include_file) ) {
    require_once ($include_file);
//      global $flag;
//        echo 'in main global scope flag='.$flag;
    test();
   }
}

something();

exit;

 //in test.php

$flag = 4;
function test() {
   global $flag;

   echo '<br/>in test flag="'.$flag.'"';
   if ($flag) {
       echo 'flag works';
     //do something
   }
}

上面的代码片段正确地回应了'全局范围'$ flag值但是没有识别值为4的$ flag,假定$ flag为null值。 请指出访问该$ flag全局变量有什么问题。

提前致谢, Anitha

6 个答案:

答案 0 :(得分:7)

您在这里遇到问题只是因为PHP当前正在解释您的文件。你有嵌套的函数。

以下是您的代码当前的执行方式:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $flag = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$flag.'"';
           if ($flag) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

exit;

正如您所看到的,当您将4的值分配给$flag$flag = 4)时,您属于函数something()的范围,而不是全球范围。

test()中,由于您在该函数中将$flag声明为全局,因此$flag是一个完全不同的变量,对整个脚本是全局的。

为避免此问题,请使用超级全局$GLOBALS。它比使用global更快,这样你就不会像上面那样混淆范围问题:

function something() {
    $include_file = 'test.php';
    if ( file_exists($include_file) ) {
        //require_once ($include_file);

        $GLOBALS['flag'] = 4;
        function test() {
           global $flag;

           echo '<br/>in test flag="'.$GLOBALS['flag'].'"';
           if ($GLOBALS['flag']) {
               echo 'flag works';
             //do something
           }
        }

        //end require_once ($include_file);

        test();
    }
}

something();

echo $flag; //echos 4

exit;

答案 1 :(得分:2)

这条线可能会给你带来问题:echo 'global scope flag'=$flag;

将其更改为:echo 'global scope flag = '.$flag;

修改 现在您已经通过将代码包装在something()函数中编辑了代码片段,问题变得更加清晰。我认为这里发生的事情是,当您使用$flag = 4;初始化$ flag时,它的范围在something()方法中。

尝试在行$flag = 4;之上/之前放置function something() {。那么一切都将与世界一致。

答案 2 :(得分:2)

$flag = 4;不在全球范围内。

  

如果包含发生在   然后,调用文件中的函数   包含在中的所有代码   被调用的文件就像它一样   已在该功能中定义。

- include的PHP手册页,也适用于include_once,require和require_once

我要猜测你得到的错误是在if ($flag)行,因为在那一点上,$ flag是未初始化的,因为全局$ flag变量从未被赋值

顺便说一下,echo 'global scope flag='.$flag;也没有显示全局标记,因为您需要在该函数中使用global $flag;来显示全局副本,这也会产生$flag = 4;的副作用影响包含文件中的全局副本。

答案 3 :(得分:0)

不应echo 'global scope flag'=$flag;echo 'global scope flag =' . $flag;

我收到了不同的错误。这有助于我快速解决问题。

  

解析错误:解析错误,意外   '=',期待','或';'在   D:\网站(Apache)\测试   第6行的Site1 \ test.php

答案 4 :(得分:0)

做这样的事情:

$myFlag = getFlag(); 
echo $myFlag; // output: whatever


// test.php 

$flag = 'whatever'; 

function getFlag(){
    global $flag;   
    return $flag; 
}

我永远不会在一个脚本中设置变量并从另一个文件中调用它。这将导致极端混乱。即使我的解决方案也不是最好的。理想情况下,我会做一个完整的课程。

答案 5 :(得分:0)

由于您的原始问题已经得到解答,因此我建议采用另一种方法来避免全局变量 你似乎有一个函数+一个你设置为全局变量的默认值。您还可以定义default values for function parameters

<?php // test.php
function test($flags=4) {
  echo '<br/>in test flag="'.$flags.'"';
  if ($flags!=0) {
    echo ' flag works';
  }
}

没有全局变量,但你仍然可以在没有参数的情况下调用test(),函数将使用默认值 - 你可以通过传递参数来覆盖它。

function something() {
  $include_file = 'test.php';
  if ( file_exists($include_file) ) {
    require_once ($include_file);
    echo "\nwithout parameter: "; test();
    echo "\nwith a parameter: "; test(16);
  }
}
something();
exit;

打印

without parameter: <br/>in test flag="4" flag works
with a parameter: <br/>in test flag="16" flag works

那不是完全相同的行为,但它可能你想要的第一个......

编辑:另一点可能是

if ( file_exists($include_file) ) {
  require_once ($include_file);

构建你正在使用。我没有强烈的意见(或任何有力的证据;-)),但你可能想考虑使用

$something = include $include_file;
if ( false!==$something ) { /* error handling here... */ }

代替。如果php无法包含该文件,则include“返回”false。所需的全部工作是包含的文件不显式返回FALSE。此可能缓存更友好(例如,当使用APC之类的内容时)。但同样:我手边没有证据,只是预感。至少它为你的代码提供了一个“优雅地”处理错误的机会。