2000-08-20 15:02:32 +00:00
|
|
|
<chapter id="language.references">
|
|
|
|
<title>References Explained</title>
|
|
|
|
|
|
|
|
<sect1 id="language.references.whatare">
|
2000-09-06 21:27:43 +00:00
|
|
|
<title>What References Are</title>
|
2000-08-20 15:02:32 +00:00
|
|
|
<simpara>
|
|
|
|
References in PHP are means to call same variable content with
|
|
|
|
different names. They are not like C pointers, they are symbol
|
|
|
|
table aliases. Note that in PHP, variable names and variable
|
|
|
|
content are different, so same content can have different
|
|
|
|
names. The most close analogy is Unix filenames and files -
|
|
|
|
variable names are directory entries, while variable contents is
|
|
|
|
the file itself. References can be thought of as hardlinking in
|
|
|
|
Unix filesystem.
|
|
|
|
</simpara>
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
<sect1 id="language.references.whatdo">
|
2000-09-06 21:27:43 +00:00
|
|
|
<title>What References Do</title>
|
2000-08-20 15:02:32 +00:00
|
|
|
<para>
|
|
|
|
PHP references allow you to make two variables to refer to the
|
|
|
|
same content. Meaning, when you do:
|
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
$a =& $b
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
|
|
|
it means that <varname>$a</varname> and <varname>$b</varname>
|
|
|
|
point to the same variable.
|
|
|
|
<note>
|
|
|
|
<para>
|
|
|
|
<varname>$a</varname> and <varname>$b</varname> are completely
|
|
|
|
equal here, that's not <varname>$a</varname> is pointing to
|
|
|
|
<varname>$b</varname> or vice versa, that's
|
|
|
|
<varname>$a</varname> and <varname>$b</varname> pointing to the
|
|
|
|
same place.
|
|
|
|
</para>
|
|
|
|
</note>
|
|
|
|
</para>
|
2000-08-19 09:12:18 +00:00
|
|
|
<para>
|
2000-08-20 15:02:32 +00:00
|
|
|
The second thing references do is to pass variables
|
|
|
|
by-reference. This is done by making local function variable and
|
|
|
|
caller variable to be reference to the same content. Example:
|
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
function foo (&$var) {
|
|
|
|
$var++;
|
|
|
|
}
|
|
|
|
|
|
|
|
$a=5;
|
|
|
|
foo ($a);
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
|
|
|
will make <varname>$a</varname> to be 6. This happens because in
|
|
|
|
the function <varname>foo</varname> the variable
|
|
|
|
<varname>$var</varname> refers to the same content as
|
|
|
|
<varname>$a</varname>.
|
2000-08-19 09:12:18 +00:00
|
|
|
</para>
|
2000-08-20 15:02:32 +00:00
|
|
|
<simpara>
|
|
|
|
The third thing reference can do is <link
|
|
|
|
linkend="language.references.return">return by-reference</link>.
|
|
|
|
</simpara>
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
<sect1 id="language.references.arent">
|
2000-09-06 21:27:43 +00:00
|
|
|
<title>What References Are Not</title>
|
2000-08-20 15:02:32 +00:00
|
|
|
<para>
|
|
|
|
As said above, references aren't pointers. That means, the
|
|
|
|
following construct won't do what you expect:
|
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
function foo (&$var) {
|
|
|
|
$var =& $GLOBALS["baz"];
|
|
|
|
}
|
|
|
|
foo($bar);
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
|
|
|
</para>
|
|
|
|
<simpara>
|
|
|
|
What will happen that <varname>$var</varname> in foo will be bound
|
|
|
|
with <varname>$bar</varname> in caller, but then it will be
|
|
|
|
re-bound with <varname>$GLOBALS["baz"]</varname>. There's no way
|
|
|
|
to bind <varname>$bar</varname> in the caller to something else
|
|
|
|
using reference mechanism, since <varname>$bar</varname> is not
|
|
|
|
available in the function foo (it is represented by
|
|
|
|
<varname>$var</varname>, but <varname>$var</varname> has only
|
|
|
|
variable contents and not name-to-value binding in the calling
|
|
|
|
symbol table).
|
|
|
|
</simpara>
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
<sect1 id="language.references.return">
|
|
|
|
<title>Returning References</title>
|
|
|
|
<para>
|
2000-10-04 02:02:28 +00:00
|
|
|
Returning by-reference it is useful when you want to use a function
|
|
|
|
to find which variable a reference should be bound to. When
|
|
|
|
returning references, use this syntax:
|
2000-08-20 15:02:32 +00:00
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
function &find_var ($param) {
|
|
|
|
...code...
|
|
|
|
return $found_var;
|
|
|
|
}
|
|
|
|
|
|
|
|
$foo =& find_var ($bar);
|
|
|
|
$foo->x = 2;
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
2000-10-04 02:02:28 +00:00
|
|
|
In this example, the property of the object returned by the
|
|
|
|
<varname>find_var</varname> function would be set, not the
|
2000-08-20 15:02:32 +00:00
|
|
|
copy, as it would be without using reference syntax.
|
|
|
|
</para>
|
|
|
|
<note>
|
|
|
|
<simpara>
|
|
|
|
Unlike parameter passing, here you have to use
|
|
|
|
<literal>&</literal> in both places - to indicate that you
|
2000-10-04 02:02:28 +00:00
|
|
|
return by-reference, not a copy as usual, and to indicate that
|
|
|
|
reference binding, rather than usual assignment, should be done
|
|
|
|
for <varname>$foo</varname>.
|
2000-08-20 15:02:32 +00:00
|
|
|
</simpara>
|
2000-08-19 09:12:18 +00:00
|
|
|
</note>
|
2000-08-20 15:02:32 +00:00
|
|
|
</sect1>
|
2000-08-19 09:12:18 +00:00
|
|
|
|
2000-08-20 15:02:32 +00:00
|
|
|
<sect1 id="language.references.unset">
|
|
|
|
<title>Unsetting References</title>
|
|
|
|
<para>
|
|
|
|
When you unset the reference, you just break the binding between
|
|
|
|
variable name and variable content. This does not mean that
|
|
|
|
variable content will be destroyed. For example:
|
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
$a = 1;
|
|
|
|
$b =& $a;
|
|
|
|
unset ($a);
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
|
|
|
won't unset <varname>$b</varname>, just <varname>$a</varname>.
|
|
|
|
</para>
|
|
|
|
<simpara>
|
|
|
|
Again, it might be useful to think about this as analogous to Unix
|
|
|
|
<command>unlink</command> call.
|
|
|
|
</simpara>
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
<sect1 id="language.references.spot">
|
2000-09-06 21:27:43 +00:00
|
|
|
<title>Spotting References</title>
|
2000-08-20 15:02:32 +00:00
|
|
|
<simpara>
|
|
|
|
Many syntax constructs in PHP are implemented via referencing
|
|
|
|
mechanisms, so everything told above about reference binding also
|
|
|
|
apply to these constructs. Some constructs, like passing and
|
|
|
|
returning by-reference, are mentioned above. Other constructs that
|
|
|
|
use references are:
|
|
|
|
</simpara>
|
|
|
|
|
|
|
|
<sect2 id="references.global">
|
|
|
|
<title><literal>global</literal> References</title>
|
|
|
|
<para>
|
|
|
|
When you declare variable as <command>global $var</command> you
|
|
|
|
are in fact creating reference to a global variable. That means,
|
|
|
|
this is the same as:
|
|
|
|
<informalexample>
|
|
|
|
<programlisting role="php">
|
|
|
|
$var =& $GLOBALS["var"];
|
|
|
|
</programlisting>
|
|
|
|
</informalexample>
|
|
|
|
</para>
|
2000-08-19 09:12:18 +00:00
|
|
|
<simpara>
|
2000-08-20 15:02:32 +00:00
|
|
|
That means, for example, that unsetting <varname>$var</varname>
|
|
|
|
won't unset global variable.
|
2000-08-19 09:12:18 +00:00
|
|
|
</simpara>
|
2000-08-20 15:02:32 +00:00
|
|
|
</sect2>
|
2000-08-19 09:12:18 +00:00
|
|
|
|
2000-08-20 15:02:32 +00:00
|
|
|
<sect2 id="references.this">
|
|
|
|
<title><literal>$this</literal></title>
|
|
|
|
<simpara>
|
|
|
|
In an object method, <varname>$this</varname> is always reference
|
|
|
|
to the caller object.
|
|
|
|
</simpara>
|
|
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
|
|
|
|
</chapter>
|
|
|
|
|
|
|
|
<!-- 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
|
|
|
|
sgml-parent-document:nil
|
|
|
|
sgml-default-dtd-file:"../../manual.ced"
|
|
|
|
sgml-exposed-tags:nil
|
|
|
|
sgml-local-catalogs:nil
|
|
|
|
sgml-local-ecat-files:nil
|
|
|
|
End:
|
|
|
|
-->
|