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

StackOverflow https://stackoverflow.com/questions/107693

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня проблемы с глобальными переменными в 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 бесполезно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top