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