Глобальные переменные в 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 не имеет смысла.

Другие вопросы по тегам