$GLOBALS

(PHP 4, PHP 5, PHP 7, PHP 8)

$GLOBALS β€” БсылаСтся Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ глобальной области видимости

ОписаниС

Ассоциативный массив (array), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ссылки Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² глобальной области видимости скрипта. ИмСна ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” ΠΊΠ»ΡŽΡ‡ΠΈ массива.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ массива $GLOBALS

<?php

function test()
{
$foo = "Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная";

echo
'Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $foo Π² глобальной области видимости: ' . $GLOBALS["foo"] . "\n";
echo
'Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $foo Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости: ' . $foo . "\n";
}

$foo = "ΠŸΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого";
test();

?>

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆ Π½Π°:

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $foo Π² глобальной области видимости: ΠŸΡ€ΠΈΠΌΠ΅Ρ€ содСрТимого
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $foo Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости: Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная
Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅

Начиная с PHP 8.1.0 доступ Π½Π° запись всСго массива $GLOBALS большС Π½Π΅ поддСрТиваСтся:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ записи всСго массива $GLOBALS Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ

<?php

// ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²ΠΎ врСмя компиляции:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset(
$GLOBALS);
array_pop($GLOBALS);
// ...ΠΈ любая другая опСрация записи ΠΈΠ»ΠΈ чтСния-записи Π² массив $GLOBALS

?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΎ Β«ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°ΡΒ», ΠΈΠ»ΠΈ автоматичСская глобальная, пСрСмСнная. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ пСрСмСнная доступна Π²ΠΎ всСх контСкстах скрипта. Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ global $variable; для доступа ΠΊ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ трСбуСтся.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ пСрСмСнная $GLOBALS доступна Π² PHP Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ мСстС ΠΊΠΎΠ΄Π°.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π‘ PHP 8.1.0 ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ массив $GLOBALS стал доступной Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΊΠΎΠΏΠΈΠ΅ΠΉ глобальной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· копию массива ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… глобальной области видимости. РаньшС массив $GLOBALS ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π»ΡΡ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ повСдСния массивов PHP ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· копию ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ массива.

<?php

// Π”ΠΎ PHP 8.1.0
$a = 1;

$globals = $GLOBALS; // Как Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ копия ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ
$globals['a'] = 2;
var_dump($a); // int(2)

// Начиная с PHP 8.1.0
// Ρ‚Π°ΠΊΠΎΠ΅ присваиваниС большС Π½Π΅ измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π°Ρ€ΡƒΡˆΠ°Π»ΠΎ сСмантику ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ
$globals = $GLOBALS;
$globals['a'] = 1;

// Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ копию массива ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ свойство
// массива-ΠΊΠΎΠΏΠΈΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΡΡƒΠΏΠ΅Ρ€Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ массива $GLOBALS
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}

?>
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
28
inafeeur at gmail dot com ΒΆ
3 years ago
We can be more clear with the extension of the given example.

Before PHP Version 8.1

<?php
  $a = 1;
  $globals = $GLOBALS;
  $globals['a'] = 2;
  echo $a; // 2
  echo $globals['a']; // 2
  echo $GLOBALS['a'];  // 2
?>

After PHP Version 8.1

<?php
  $a = 1;
  $globals = $GLOBALS;
  $globals['a'] = 2;
  echo $a; // 1
  echo $globals['a']; // 2
  echo $GLOBALS['a'];  // 1
?>
up
16
mstraczkowski at gmail dot com ΒΆ
12 years ago
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";
up
14
vittorio.zamparella at famous googlemail ΒΆ
9 years ago
I finally found information about superglobals not being found in $GLOBALS:

https://bugs.php.net/bug.php?id=65223&edit=2
-------------------------------------
 [2013-07-09 12:00 UTC] johannes @php.net
[...]super-globals (aka. auto globals) are not added to symbol tables by default for performance reasons unless the parser sees need. i.e. 

<?php
$_SERVER;
print_r($GLOBALS);
?>

will list it. You can also control this using auto_gloals_jit in php.ini: http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit
-------------------------------------

http://www.php.net/manual/en/language.variables.variable.php
-------------------------------------
Warning
Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
-------------------------------------
up
15
therandshow at gmail dot com ΒΆ
14 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.