1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry role="variable" xml:id="reserved.variables.globals" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>$GLOBALS</refname>
<refpurpose>References all variables available in global scope</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>
An associative <type>array</type> containing references to all variables which
are currently defined in the global scope of the script. The
variable names are the keys of the array.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example xml:id="variable.globals.basic">
<title><varname>$GLOBALS</varname> example</title>
<programlisting role="php">
<![CDATA[
<?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();
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
$foo in global scope: Example content
$foo in current scope: local variable
]]>
</screen>
</example>
</para>
<warning>
<para>
As of PHP 8.1.0, write access to the entire <varname>$GLOBALS</varname> array is no longer supported:
<example xml:id="variable.globals.entire_write_error">
<title>writing entire <varname>$GLOBALS</varname> will result in error.</title>
<programlisting role="php">
<![CDATA[
<?php
// Generates compile-time error:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
array_pop($GLOBALS);
// ...and any other write/read-write operation on $GLOBALS
?>
]]>
</programlisting>
</example>
</para>
</warning>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
¬e.is-superglobal;
<note>
<title>Variable availability</title>
<para>
Unlike all of the other <link linkend="language.variables.superglobals">superglobals</link>,
<varname>$GLOBALS</varname> has essentially always been available in PHP.
</para>
</note>
<note>
<para>
As of PHP 8.1.0, <varname>$GLOBALS</varname> is now a read-only copy of
the global <link linkend="features.gc.refcounting-basics">symbol table</link>.
That is, global variables cannot be modified via its copy.
Previously, <varname>$GLOBALS</varname> array is excluded from the usual
by-value behavior of PHP arrays and global variables can be modified via its copy.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
// Before PHP 8.1.0
$a = 1;
$globals = $GLOBALS; // Ostensibly by-value copy
$globals['a'] = 2;
var_dump($a); // int(2)
// As of PHP 8.1.0
// this no longer modifies $a. The previous behavior violated by-value semantics.
$globals = $GLOBALS;
$globals['a'] = 1;
// To restore the previous behavior, iterate its copy and assign each property back to $GLOBALS.
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}
?>
]]>
</programlisting>
</informalexample>
</para>
</note>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|