Pergunta

Estou tendo problemas com variáveis ??globais em php. Eu tenho um conjunto $screen var em um arquivo, o que exige um outro arquivo que chama um initSession() definido em outro arquivo. O initSession() declara global $screen e, em seguida, processa $ tela ainda mais para baixo, usando o valor definido no primeiro script.

Como é isto possível?

Para tornar as coisas mais confusas, se você tentar definir $ tela novamente, em seguida, chamar o initSession(), ele usa o valor usado pela primeira vez, mais uma vez. O código a seguir irá descrever o processo. alguém poderia ter ir em explicar isso?

$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" 

Update:
Se eu declarar $screen mundial novamente apenas antes de exigir o segundo modelo, $ tela é atualizado corretamente para o método initSession(). Strange.

Foi útil?

Solução

Global não faz a variável global. Eu sei que é complicado: -)

Global diz que uma variável local será usado como se fosse uma variável com um escopo maior .

por exemplo:

<?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'
?>

Note que vars globais raramente são uma boa idéia. Você pode codificar 99,99999% do tempo sem eles e seu código é muito mais fácil de manter, se você não tem escopos fuzzy. Evite global se você puder.

Outras dicas

global $foo não significa "fazer esta variável global, para que todos possam usá-lo". meios global $foo " no âmbito desta função , utilize o $foo variável global".

Estou assumindo a partir de seu exemplo, que cada vez, você está se referindo $ tela de dentro de uma função. Se assim você vai precisar usar global $screen em cada função.

Você precisa colocar "$ tela global" em todas as funções que as referências, não apenas no topo de cada arquivo.

Se você tem um monte de variáveis ??que você deseja acessar durante uma tarefa que usa muitas funções, considere fazer um objeto 'contexto' para manter as coisas:

//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);

Agora é só passar este objeto como um parâmetro para todas as funções. Você não vai precisar de variáveis ??globais, e suas assinaturas de função ficar limpo. É também fácil de mais tarde substituir o StdClass vazio com uma classe que realmente tem métodos relevantes nele.

Os vãos âmbito global incluído e arquivos necessários, você não precisa usar a palavra-chave global a menos que usando a variável de dentro de uma função. Você pode tentar usar a matriz $ GLOBALS vez.

Você deve declarar uma variável como global antes definir valores para ele.

É inútil até que está na função ou uma classe. meios globais que você pode usar uma variável em qualquer parte do programa. Portanto, se o global não está contida na função ou uma classe não há uso de usar global

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top