глобальные переменные в php не работают должным образом - PullRequest
25 голосов
/ 20 сентября 2008

У меня проблемы с глобальными переменными в php. У меня есть $screen var, установленный в одном файле, для которого требуется другой файл, который вызывает initSession(), определенный в еще одном файле. initSession() объявляет global $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(). Странно.

Ответы [ 7 ]

61 голосов
/ 20 сентября 2008

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

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

E.G:

<?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, если можете.

15 голосов
/ 20 сентября 2008

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

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

4 голосов
/ 20 сентября 2008

Если у вас есть много переменных, к которым вы хотите получить доступ во время задачи, которая использует много функций, рассмотрите возможность создания объекта «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 классом, в котором есть соответствующие методы.

4 голосов
/ 20 сентября 2008

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

1 голос
/ 20 сентября 2008

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

0 голосов
/ 29 мая 2014

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

не имеет смысла.
0 голосов
/ 01 июля 2012

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

...