глобальные переменные в php не работают как ожидалось

У меня возникают проблемы с глобальными переменными в php. У меня есть $screen var, установленный в одном файле, для которого требуется другой файл, который вызывает initSession() определенный в еще одном файле. initSession() объявляет global $screen а затем обрабатывает $ screen дальше вниз, используя значение, установленное в самом первом скрипте.

Как это возможно?

Чтобы сделать вещи более запутанными, если вы попытаетесь снова установить $ screen, тогда вызовите initSession() , он использует значение, впервые использованное еще раз. Следующий код описывает процесс. Может ли кто-нибудь объяснить это?

 $screen = "list1.inc"; // From model.php require "controller.php"; // From model.php initSession(); // From controller.php global $screen; // From Include.Session.inc echo $screen; // prints "list1.inc" // From anywhere $screen = "delete1.inc"; // From model2.php require "controller2.php" initSession(); global $screen; echo $screen; // prints "list1.inc" 

Обновить:
Если я объявляю $screen глобальным снова перед тем, как требовать вторую модель, $ screen обновляется должным образом для initSession() . Странный.

Solutions Collecting From Web of "глобальные переменные в php не работают как ожидалось"

Global НЕ делает переменную глобальной. Я знаю, что это сложно 🙂

Global говорит, что локальная переменная будет использоваться, как если бы она была переменной с более высокой областью .

EG:

 <?php $var = "test"; // this is accessible in all the rest of the code, even an included one function foo2() { global $var; echo $var; // this print "test" $var = 'test2'; } global $var; // this is totally useless, unless this file is included inside a class or function function foo() { echo $var; // this print nothing, you are using a local var $var = 'test3'; } foo(); foo2(); echo $var; // this will print 'test2' ?> 

Обратите внимание, что глобальные вары редко бывают хорошей идеей. Вы можете закодировать 99.99999% времени без них, и ваш код намного проще поддерживать, если у вас нет нечетких областей. Избегайте global если сможете.

global $foo не означает «сделать эту переменную глобальной, чтобы каждый мог ее использовать». global $foo означает « в рамках этой функции использовать глобальную переменную $foo ».

Я исхожу из вашего примера, что каждый раз вы ссылаетесь на $ screen изнутри функции. Если это так, вам нужно будет использовать global $screen в каждой функции.

Если у вас есть много переменных, которые вы хотите получить во время задачи, которая использует множество функций, подумайте о создании объекта «context» для хранения этого материала:

 //We're doing "foo", and we need importantString and relevantObject to do it $fooContext = new StdClass(); //StdClass is an empty class $fooContext->importantString = "a very important string"; $fooContext->relevantObject = new RelevantObject(); doFoo($fooContext); 

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

Вам нужно поставить «глобальный $ screen» в каждую функцию, которая ссылается на нее, а не только на верхнюю часть каждого файла.

В глобальные области охвата включены и требуемые файлы, вам не нужно использовать ключевое слово global, если не использовать переменную из функции. Вместо этого вы можете попробовать использовать массив $ GLOBALS.

Вы должны объявить переменную как глобальную, прежде чем определять значения для нее.

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