PHP - глобальные переменные очищаются - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть PHP-файл, импортированный с помощью вызова require_once () в другом PHP-файле, который загружается автоматически. В этом файле определено небольшое количество строковых глобальных переменных:

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

class FooClass {
    private $foo;

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

Однако, когда я запускаю этот код, глобальная переменная $ foobar равна "" в соответствии с XDebug в Apache2 (я использую VS.php в качестве своей IDE). Я получаю ту же проблему, когда запускаю скрипт под обычным PHP FastCGI под IIS.

Я прошел весь свой код, и символ «$ foobar» появляется только в этом исходном файле, поэтому он не перезаписывается в других местах.

Я с тех пор изменил ее с глобальной переменной на константу define (), и она отлично работает.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 23 ноября 2011

Код работает нормально для меня. Ничего плохого в коде. Это дает мне вывод как foo:

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

class FooClass {
    private $foo;

    public function __construct() {
        global $foobar;
        $this->foo = $foobar; // $foobar is foo here
   }
}
1 голос
/ 23 ноября 2011

Использование суперглобального - $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();
?>
0 голосов
/ 22 июня 2019

если ваша переменная была не статичной, вы должны вызвать $this->variable, а если ваша переменная была статической, вы должны вызвать self::$variable

например:

    class Entry {

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

          public function start() {
          $a=$this->x;
          $b=self::$y;
    }
  }
0 голосов
/ 23 ноября 2011

То, что эти два объявления переменных являются первыми в сценарии включения, не означает, что они на самом деле находятся в глобальной области видимости.

Включение сценария из функции (вашего автозагрузчика) сделает их постояннымив этой функции локальная сфера.Вы не заметите, так как ваша область автозагрузчика даже не сохранит их.

Решение: также используйте оператор global перед назначением самых верхних переменных в вашем скрипте.

...