PHP - 全局变量被清除

时间:2011-11-23 04:38:55

标签: php global-variables

我在另一个自动加载的PHP文件中有一个由require_once()调用导入的PHP文件。在此文件中定义了少量字符串全局变量:

$foobar = "foo";
$bazqux = "baz";

class FooClass {
    private $foo;

    public function __construct() {
        global $foobar;
        $this->foo = $foobar; // $foobar is <null> here
    }
}

但是,当我运行此代码时,根据Apache2下的XDebug(我使用VS.php作为我的IDE),全局变量$ foobar是“”。当我在IIS下的普通PHP FastCGI下运行脚本时,我遇到了同样的问题。

我已经浏览了所有代码,并且符号“$ foobar”仅出现在此源文件中,因此不会被其他地方覆盖。

我将它从全局变量更改为define()常量,并且工作正常。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

使用超全球 - $GLOBALS

$this->foo = $GLOBALS["foobar"];

编辑:

<?php
$foobar = "foo";
$bazqux = "baz";

class FooClass {
    private $foo;

    public function __construct() {
        global $foobar;
        $this->foo = $foobar;  
    }
    function display() {
      print $this->foo;
    }
}

$a=new FooClass;
print $a->display();
?>

答案 1 :(得分:1)

代码对我来说很好。代码没有错。它输出为foo

$foobar = "foo";
$bazqux = "baz";

class FooClass {
    private $foo;

    public function __construct() {
        global $foobar;
        $this->foo = $foobar; // $foobar is foo here
   }
}

答案 2 :(得分:0)

仅仅因为这两个变量声明是include脚本中的第一件事并不意味着它们实际上在全局范围内。

在函数(自动加载器)中包含脚本会使它们驻留在函数本地范围内。您将不会注意到,因为您的自动加载器范围甚至不会保留它们。

解决方案:在分配脚本中最顶层的变量之前,还要使用global语句。

答案 3 :(得分:0)

如果变量是非静态的,则必须调用$this->variable;如果变量是静态的,则必须调用self::$variable

例如:

    class Entry {

          private static $y= "";
          private $x= "";

          public function start() {
          $a=$this->x;
          $b=self::$y;
    }
  }