Вопрос по php – глобальные переменные в php не работают должным образом

25

У меня проблемы с глобальными переменными в 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() метод. Странный.

global $a; эквивалентно$a =& $GLOBALS['a'];, То есть он создает ссылку в локальной области с тем же именем. Вне функции вы всегда находитесь в глобальной области видимости. PHP не предоставляет & quot; область файла. & Quot; Matthew

Ваш Ответ

7   ответов
0

прежде чем определять значения для нее.

Что добавляет ваш ответ к ранее принятому и высоко оцененному ответу? Хотите прокомментировать и добавить пример кода?
15

global $foo "не означает" делает эту переменную глобальной, чтобы ее могли использовать все ".global $foo означает & quot;within the scope of this function, используйте глобальную переменную$foo& Quot ;.

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

1

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

4

которая ссылается на него, а не только в верхней части каждого файла.

61

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

Global говорит, что будет использоваться локальная переменнаяas if it was a variable with a higher scope.

Е.Г .:

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Josh Smeaton
Error: User Rate Limit Exceeded
0

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

4

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

//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 классом, в котором действительно есть соответствующие методы.

Похожие вопросы