глобальные переменные в 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
global перед тем, как потребуется вторая модель, $screen корректно обновляется для initSession()
метод.Странный.
Решение
Global
НЕ делает переменную глобальной.Я знаю, что это сложно :-)
Global
говорит, что будет использоваться локальная переменная как если бы это была переменная с более высокой областью видимости.
Э.Г:
<?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
в каждой функции.
Вам нужно поместить «глобальный $screen» в каждую функцию, которая ссылается на него, а не только в начало каждого файла.
Если у вас много переменных, к которым вы хотите получить доступ во время задачи, в которой используется множество функций, рассмотрите возможность создания объекта «контекста» для хранения этих данных:
//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 классом, в котором действительно есть соответствующие методы.
Глобальная область действия охватывает включенные и обязательные файлы, вам не нужно использовать ключевое слово global, если только вы не используете переменную внутри функции.Вместо этого вы можете попробовать использовать массив $GLOBALS.
Вы должны объявить переменную как глобальную, прежде чем определять для нее значения.
Это бесполезно, пока оно не находится в функции или классе.Глобальный означает, что вы можете использовать переменную в любой части программы.Поэтому, если глобальное значение не содержится в функции или классе, использование Global бесполезно.