Watch out when you are trying to set $GLOBALS to the local variable.
Even without reference operator "&" your variable seems to be referenced to the $GLOBALS
You can test this behaviour using below code
<?php
/**
* Result:
* POST: B, Variable: C
* GLOBALS: C, Variable: C
*/
// Testing $_POST
$_POST['A'] = 'B';
$nonReferencedPostVar = $_POST;
$nonReferencedPostVar['A'] = 'C';
echo 'POST: '.$_POST['A'].', Variable: '.$nonReferencedPostVar['A']."\n\n";
// Testing Globals
$GLOBALS['A'] = 'B';
$nonReferencedGlobalsVar = $GLOBALS;
$nonReferencedGlobalsVar['A'] = 'C';
echo 'GLOBALS: '.$GLOBALS['A'].', Variable: '.$nonReferencedGlobalsVar['A']."\n\n";
$GLOBALS
$GLOBALS — Referencia todas variáveis disponíveis no escopo global
Descrição
Um array associativo contendo referências para todas as variáveis que estão atualmente definidas no escopo global do script. O nome das variáveis são chaves do array.
Exemplos
Exemplo #1 Exemplo da $GLOBALS
<?php
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
O exemplo acima irá imprimir algo similar à:
$foo in global scope: Example content $foo in current scope: local variable
Notas
Nota:
Esta é uma 'superglobal', ou global automática, variável. Isto simplismente significa que ela está disponível em todos escopos pelo script. Não há necessidade de fazer global $variable; para acessá-la dentro de uma função ou método.
Nota: Disponibilidade da variável
Diferente de todas as outras superglobais, $GLOBALS tem essencialmente sempre estado disponível no PHP.
mstraczkowski at gmail dot com ¶
21 days ago
therandshow at gmail dot com ¶
2 years ago
As of PHP 5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is I'm not sure, but I've never liked $GLOBALS much anyways.
bkilinc at deyta dot net ¶
2 months ago
I prefer accessing globals through static function calls. Source code looks better; I use glb::get('myglobalvar') instead of $GLOBALS['myglobalvar']. This gives me full control over global access, which can be the source of problems in practice.
class glb
{
static public function set($name, $value)
{
$GLOBALS[$name] = $value;
}
static public function get($name)
{
return $GLOBALS[$name];
}
}
$myglobalvar = 'Hello, World !';
function myfunction()
{
$val = glb::get('myglobalvar');
echo "$val\n";
glb::set('myglobalvar', 'hi, again :)');
$val = glb::get('myglobalvar');
echo "$val\n";
}
myfunction();
ravenswd at yahoo dot com ¶
4 years ago
Keep in mind that $GLOBALS is, itself, a global variable. So code like this won't work:
<?php
print '$GLOBALS = ' . var_export($GLOBALS, true) . "\n";
?>
This results in the error message: "Nesting level too deep - recursive dependency?"
Gratcy ¶
1 year ago
this is technique that i always did for configuration file..
<?php
$conf['conf']['foo'] = 'this is foo';
$conf['conf']['bar'] = 'this is bar';
function foobar() {
global $conf;
var_dump($conf);
}
foobar();
/*
result is..
array
'conf' =>
array
'foo' => string 'this is foo' (length=11)
'bar' => string 'this is bar' (length=11)
*/
?>
