Como declarar uma variável global em php?

168

Eu tenho código algo como isto:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

existe alguma maneira de definir a variável global em um único local e tornar a variável $aacessível em todas as funções de uma só vez? sem fazer uso de global $a;mais?

LUZ
fonte
15
Não, não existe. Se você não gostar da globalpalavra - chave, considere usar a $GLOBALS['a']superglobal em todos os escopos ou passe o parâmetro para suas funções.
22712 Michael Michael Berkowski
5
Se é algo importante, mesmo uma sessão var pode ser usada.
Nikos Tsirakis

Respostas:

259

A $GLOBALSmatriz pode ser usada:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

Do manual :

Uma matriz associativa contendo referências a todas as variáveis ​​atualmente definidas no escopo global do script. Os nomes das variáveis ​​são as chaves da matriz.


Se você possui um conjunto de funções que precisam de algumas variáveis ​​comuns, uma classe com propriedades pode ser uma boa opção em vez de uma global:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);
MrCode
fonte
78

Se a variável não mudar, você pode usar define

Exemplo:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}
Dale
fonte
2
O que acontece quando FOOTER_CONTENTse tenta modificar? É como finalem Java ou constem C, C ++ e C #?
Lion
4
Se você tentar definir FOOTER_CONTENT uma segunda vez, o php emitirá um aviso sobre isso
Dale
Eu precisava calcular o tempo da época atual do unix cada vez que uma página é carregada e, em seguida, usar esse valor em alguns cálculos (funções). "define" funcionou para mim. Inicialmente, eu não vi esse "eco FOOTER_CONTENT;" não tinha um '$' anterior e eu recebi erros.
user208145
Se a variável não vai mudar, não é uma variável. Não é ?!
Sajidur Rahman 28/03
29

Adicione suas variáveis ​​no array super global $ GLOBALS como

$GLOBALS['variable'] = 'localhost'; 

e usá-lo globalmente

ou você pode usar constantes acessíveis em todo o script

define('HOSTNAME', 'localhost');  
Pankaj Khairnar
fonte
1
Se você usar 'define', uma vez definido, não poderá alterar uma definição!
Reza MA
no seu primeiro exemplo, está dizendo que a variável '$ agora é chamada de' localhost 'posteriormente no script?
Zach Smith
não, se você quiser usar essa variável, precisará usá-la como $ GLOBALS ['variable'];
Pankaj Khairnar
25

Se uma variável é declarada fora de uma função, ela já está no escopo global. Portanto, não há necessidade de declarar. Mas de onde você está chamando essa variável deve ter acesso a essa variável. Se você estiver chamando de dentro de uma função, precisará usar a globalpalavra-chave:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Usar palavra-chave global fora de uma função não é um erro. Se você deseja incluir esse arquivo dentro de uma função, pode declarar a variável como global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Você pode usar $GLOBALStambém. É uma superglobal, por isso tem acesso a todos os lugares.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

Dependendo da sua escolha, você também pode escolher.

Sajidur Rahman
fonte
9

Essa resposta é muito tardia, mas o que faço é definir uma classe que contenha valores booleanos, matrizes e valores iniciais inteiros como variáveis ​​estáticas do escopo global. Quaisquer cadeias constantes são definidas como tal.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

As staticpalavras-chave devem estar presentes na classe, caso contrário, os vars $ a, $ be $ c não terão escopo global.

A primeira e única química
fonte
Esta é uma boa solução por vários motivos. A classe static requer apenas alguns caracteres adicionados ao nome da variável básica: G :: $ Name, onde a declaração se parece com isso: class G {static $ Name, $ Name2;} Observe que G pode ser verdadeiramente variáveis ​​globais, então E poderia ser usado para variáveis ​​relacionadas aos funcionários. É mais fácil programar com o paradigma orientado a objetos em grande escala suportado pelo PHP. Se constantes forem realmente necessárias, você poderá declará-las após "const", assim como as variáveis ​​declaradas após "estática" - deixe de fora os cifrões. G :: Example seria um exemplo de uma constante global.
David Spector
5

Você respondeu isso da maneira que escreveu a pergunta - use 'define'. mas uma vez definido, você não pode alterar uma definição.

Como alternativa, existem truques com uma constante em uma classe, como class :: constant que você pode usar. Você também pode torná-los variáveis ​​declarando propriedades estáticas para a classe, com funções para definir a propriedade estática, se desejar alterá-la.

Robbie
fonte
5

Você pode tentar a palavra-chave usenas funções Closure ou Lambdas, se isso se adequar à sua intenção ... Porém, o PHP 7.0. Não é melhor, mas apenas uma alternativa.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

demonstração | informação

Thielicious
fonte
1

Vamos pensar um pouco diferente:

class globe{
    static $foo = "bar";
}

E você pode usá-lo e modificá-lo da maneira que quiser, como:

function func(){
    echo globe::$foo;
}
Amir Fo
fonte
0

E se você usar a função processual em vez da variável e chamá-la para qualquer lugar que desejar.

Eu costumo fazer uma coleção de valores de configuração e colocá-los dentro de uma função com declaração de retorno. Apenas incluo o local em que preciso fazer uso do valor global e chamar uma função específica.

function host()
{
   return "localhost";
}
Veshraj Joshi
fonte
0

$GLOBALS[] é a solução certa, mas como estamos falando de alternativas, uma função também pode fazer esse trabalho facilmente:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}
Dario Ferrer
fonte
-19

Você não deveria mais usar globals, eles não estão disponíveis no PHP 5.4.

Daniel West
fonte
19
O REGISTRO GLOBALS foi removido. não globais.
usar o seguinte comando
7
Esta resposta, como está escrita, está errada e deve ser atualizada para refletir o comentário da unity100. Se o GLOBALS ainda estiver disponível, esclareça quais aspectos dos vars GLOBAL foram alterados. Algo assim.
Crashwap
@RobertColumbia Post muito interessante, e eu vou manter isso em mente para outras respostas, mas não se aplica neste caso específico. (Espero que você esteja usando essa meta para mostrar como uma resposta "não faça isso" pode ser válida e não a justificativa de que essa seja;)) " " Não faça isso " pode ser uma resposta válida . "-" pode ser "não" é ". " Mas, às vezes, nada precisa ser feito. Se você parar de fazer a coisa errada, tudo começará a funcionar magicamente novamente. " - Não se aplica aqui, pois o código não está "quebrado". O OP só quer uma maneira "menos digitada" de fazer as coisas. …
robinCTS
" ele está realmente tentando responder à pergunta? Na maioria dos casos, é. " - "Most", não "all". (Eu até contestaria o "máximo", mas não vi respostas suficientes para argumentar bem). " Nesse caso, não é. " - E nesta "resposta", não é também, pelas mesmas razões: " Pior, a resposta de Murphy não propõe uma solução para o problema " e " Não dá" o solicitante uma ferramenta ou um método ou qualquer coisa que se pareça com uma solução para o seu problema ". ...
robinCTS