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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- up-to-date against phpdoc/en/language/ref.xml:1.6 -->
<chapter id="language.references">
<title>References uitgelegd</title>
<sect1 id="language.references.whatare">
<title>What References Are</title>
<simpara>
References in PHP geven de mogelijkheid om dezelfde variable
verschillende namen te geven. Ze zijn niet gelijk aan pointers
in C, maar het zijn aliases in de symbol table van PHP. In
PHP zijn variabele namen en variabele inhoud erg verschillend,
daarom kan de zelfde content verschillende namen hebben. Een
goed lijkend voorbeeld zijn Unix filenames and file -
variabelenamen zijn directory entries, en variabelen zijn de
file waarnaar de entry verwijst. References kom in dit voorbeeld
dan overeen met hardlinks.
</simpara>
</sect1>
<sect1 id="language.references.whatdo">
<title>Wat References doen</title>
<para>
PHP references namek het mogelijk om twee variabelen naar dezelfde
inhoud te laten wijzen, bijvoorbeeld als je doet:
<informalexample>
<programlisting role="php">
$a =& $b
</programlisting>
</informalexample>
dan wijzen <varname>$a</varname> en <varname>$b</varname>
naar exact dezelfde variabele.
<note>
<para>
<varname>$a</varname> en <varname>$b</varname> zijn helemaal
gelijk hier, het is niet dat <varname>$a</varname> naar
<varname>$b</varname> wijst of andersom, maar
<varname>$a</varname> en <varname>$b</varname> wijzen naar
dezelde inhoud.
</para>
</note>
</para>
<para>
Het tweede dat je met references kunt doen is het doorgeven van
variabelen by-reference. Dit wordt gedaan door een locale functie
variabele aan een variabele te koppelen die wordt gebruikt in de
aanroep, op deze manier wijzen ze dan naar dezelfde ruimte, zie
dit voorbeeld:
<informalexample>
<programlisting role="php">
function foo (&$var) {
$var++;
}
$a=5;
foo ($a);
</programlisting>
</informalexample>
In dit voorbeeld zal na aanroep van <literal>foo ($a)</literal>
<varname>$a</varname> gelijk zijn aan 6. Dit gebeurd omdat in de
functie <varname>foo</varname> de variabele
<varname>$var</varname> refereert naar dezelfde ruimte als
<varname>$a</varname>.
</para>
<simpara>
Het derde dat references kunnen doen is <link
linkend="language.references.return">return by-reference</link>.
</simpara>
</sect1>
<sect1 id="language.references.arent">
<title>What References niet zijn</title>
<para>
Zoals eerder gezegd zijn references geen pointers. Dat betekend dat
de volgende constructie niet doet wat je zou verwachten:
<informalexample>
<programlisting role="php">
function foo (&$var) {
$var =& $GLOBALS["bazar"];
}
foo($bar);
</programlisting>
</informalexample>
</para>
<simpara>
Hier wordt <varname>$var</varname> in foo gebonden aan
<varname>$bar</varname> in de aanroep, maar wordt dan herbonden
met <varname>$GLOBALS["baz"]</varname>. Er is geen enkele manier
om <varname>$bar</varname> in de aanroep te binden aan iets anders
met het references mechanisme, omdat <varname>$bar</varname> niet
beschikbaar is in de functie foo (het wordt gerepresenteerd door
<varname>$var</varname>, maar <varname>$var</varname> heeft alleen
maar variabele inhoud en geen naam-naar-value binding in de symbol
table van de aanroepende functie).
</simpara>
</sect1>
<sect1 id="language.references.return">
<title>Returning References</title>
<para>
Returning by-reference is nuttig als je in een functie een variabele
wilt zoeken waaraan een reference gebonden moet worden. Als je
references wilt teruggeven gebruik je de volgende syntax:
<informalexample>
<programlisting role="php">
function &find_var ($param) {
...code...
return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
</programlisting>
</informalexample>
In dit voorbeeld wordt de property van het object dat teruggegeven
wordt door de <varname>find_var</varname> functie worden aangepast
tot 2, en niet op een kopie van het object zoals gebeurd zou zijn
als je niet de reference syntax gebruikt.
</para>
<note>
<simpara>
In tegenstelling tot het doorgeven van parameter passing, moet je
hier <literal>&</literal> gebruiken op beide plaatsen om
aan te geven dat je wilt teruggeven by-rerence, en niet op een
kopie, zoals normaal gebeurd.
</simpara>
</note>
</sect1>
<sect1 id="language.references.unset">
<title>References verbreken</title>
<para>
Als je een reference unset, dan verbreek je alleen de binding
tussen de variabele naam en de inhoud van de variabele. Dit
betkend niet dat de inhoud van de variabele wordt verwijderd.
Bij voorbeeld zal
<informalexample>
<programlisting role="php">
$a = 1;
$b =& $a;
unset ($a);
</programlisting>
</informalexample>
<varname>$b</varname> nog steeds 1 bevatten, alleen zal
<varname>$a</varname> niet meer verwijzen naar deze inhoud (en
bestaat dus niet meer).
</para>
<simpara>
Je kunt ook hierbij weer denken aan de analogie met de Unix system
call <command>unlink</command>.
</simpara>
</sect1>
<sect1 id="language.references.spot">
<title>Spotting References</title>
<simpara>
Veel syntax constructies in PHP zijn geïnplementeerd met
reference mechanismen. Alles wat hierboven is verteld geld ook
voor deze constructies. Sommige constructies, zoals het doorgeven
en teruggeven van references zijn eerder genoemd. Andere
constructies die references gebruiken zijn:
</simpara>
<sect2 id="references.global">
<title><literal>global</literal> References</title>
<para>
Als je een variabele declareerd met <command>global $var</command>,
dan maak he eigenlijk een reference naar een global variabele.
Dit betekend dat dit hetzlefde is als:
<informalexample>
<programlisting role="php">
$var =& $GLOBALS["var"];
</programlisting>
</informalexample>
</para>
<simpara>
Dit betekend ook dat het unsetting van <varname>$var</varname> in
dit voorbeeld, niet de globale variabele unset.
</simpara>
</sect2>
<sect2 id="references.this">
<title><literal>$this</literal></title>
<simpara>
In een methode van een object is <varname>$this</varname> altijd
een reference naar het object wat de methode heeft aangeroepen.
</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
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|