<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.references.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.references.whatdo.php',
    1 => 'Was Referenzen leisten',
    2 => 'Was Referenzen leisten',
  ),
  'up' => 
  array (
    0 => 'language.references.php',
    1 => 'Referenzen',
  ),
  'prev' => 
  array (
    0 => 'language.references.whatare.php',
    1 => 'Was Referenzen sind',
  ),
  'next' => 
  array (
    0 => 'language.references.arent.php',
    1 => 'Was Referenzen nicht sind',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/references.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.references.whatdo" class="sect1">
   <h2 class="title">Was Referenzen leisten</h2>
   <p class="para">
    Es können grundsätzlich drei Operationen mit Referenzen durchgeführt werden:
    <a href="language.references.whatdo.php#language.references.whatdo.assign" class="link">Referenzzuweisung</a>,
    <a href="language.references.whatdo.php#language.references.whatdo.pass" class="link">Referenzübergabe</a> und
    <a href="language.references.whatdo.php#language.references.whatdo.return" class="link">Referenzrückgabe</a>.
    Dieser Abschnitt enthält eine Einführung zu diesen Operationen mit Links zu
    weiteren Informationen.
   </p>
   <div class="sect2" id="language.references.whatdo.assign">
    <h3 class="title">Referenzzuweisung</h3>
    <p class="para">
     PHP Referenzen erlauben es, zwei Variablennamen, sich auf den gleichen
     Variableninhalt beziehen zu lassen. Zum Beispiel:
     <div class="informalexample">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$a </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
     Das bedeutet, dass <var class="varname">$a</var> und <var class="varname">$b</var>
     auf denselben Inhalt zeigen.
     <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
      <p class="para">
       <var class="varname">$a</var> und <var class="varname">$b</var> sind hier gleichwertig,
       und <var class="varname">$a</var> ist kein Zeiger auf <var class="varname">$b</var>
       oder umgekehrt, sondern <var class="varname">$a</var> und <var class="varname">$b</var>
       zeigen auf dieselben Stelle.
      </p>
     </p></blockquote>
    </p>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Wenn man eine undefinierte Variable per Referenz zuweist, übergibt oder
      zurückgibt, wird sie erstellt.
      <div class="example" id="example-1">
       <p><strong>Beispiel #1 Referenzen mit undefinierten Variablen benutzen</strong></p>
       <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">$var</span><span style="color: #007700">) {}<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">); </span><span style="color: #FF8000">// $a wird "erstellt" und dem Wert null zugewiesen<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= array();<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$b</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">(</span><span style="color: #DD0000">'b'</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">)); </span><span style="color: #FF8000">// bool(true)<br /><br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">d</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">property_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">, </span><span style="color: #DD0000">'d'</span><span style="color: #007700">)); </span><span style="color: #FF8000">// bool(true)<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
     </p>
    </p></blockquote>
    <p class="para">
     Diese Syntax kann auch mit Funktionen, die Referenzen zurückgeben, benutzt
     werden:
     <div class="informalexample">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$foo </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">find_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$bar</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>
    <p class="para">
     Die Verwendung der gleichen Syntax bei einer Funktion, die
     <em>nicht</em> per Referenz zurückgibt, führt zu einem
     Fehler, ebenso wie die Verwendung mit dem Ergebnis des
     <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new</a>-Operators. Obwohl
     Objekte als Zeiger übergeben werden, sind diese nicht dasselbe wie
     Referenzen, wie im Abschnitt über
     <a href="language.oop5.references.php" class="link">Objekte und Referenzen</a>
     erläutert wird.
    </p>
    <div class="warning"><strong class="warning">Warnung</strong>
     <p class="para">
      Wird eine Referenz auf eine Variable zugewiesen, die in einer Funktion
      als <code class="literal">global</code> deklariert wurde, dann ist die Referenz
      nur innerhalb der Funktion sichtbar. Das kann vermieden werden, indem
      das <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>-Array verwendet wird.
      <div class="example" id="example-2">
       <p><strong>Beispiel #2 Referenzieren globaler Variablen innerhalb von Funktionen</strong></p>
       <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$var1 </span><span style="color: #007700">= </span><span style="color: #DD0000">"Beispiel-Variable"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$var2 </span><span style="color: #007700">= </span><span style="color: #DD0000">""</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">$use_globals</span><span style="color: #007700">)<br />{<br />    global </span><span style="color: #0000BB">$var1</span><span style="color: #007700">, </span><span style="color: #0000BB">$var2</span><span style="color: #007700">;<br /><br />    if (!</span><span style="color: #0000BB">$use_globals</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$var2 </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$var1</span><span style="color: #007700">; </span><span style="color: #FF8000">// nur innerhalb der Funktion sichtbar<br />    </span><span style="color: #007700">} else {<br />        </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">"var2"</span><span style="color: #007700">] =&amp; </span><span style="color: #0000BB">$var1</span><span style="color: #007700">; </span><span style="color: #FF8000">// ebenso im globalen Kontext sichtbar<br />    </span><span style="color: #007700">}<br />}<br /><br /></span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">false</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Der Wert von var2 ist '</span><span style="color: #0000BB">$var2</span><span style="color: #DD0000">'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// Der Wert von var2 ist ''<br /><br /></span><span style="color: #0000BB">global_references</span><span style="color: #007700">(</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Der Wert von var2 ist '</span><span style="color: #0000BB">$var2</span><span style="color: #DD0000">'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// Der Wert von var2 ist 'Beispiel-Variable'<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
      <code class="literal">global $var;</code> kann als Abkürzung für
      <code class="literal">$var =&amp; $GLOBALS[&#039;var&#039;];</code> angesehen werden. Daher
      ändert die Zuweisung einer anderen Referenz zu <code class="literal">$var</code>
      nur die Referenz der lokalen Variable.
     </p>
    </div>
    <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
     <p class="para">
      Wenn man einer Variable einen Wert per Referenz in einer
      <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>-Anweisung zuweist, werden auch die Referenzen geändert.
      <div class="example" id="example-3">
       <p><strong>Beispiel #3 Referenzen und die foreach-Anweisung</strong></p>
       <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$ref </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$row </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$ref</span><span style="color: #007700">;<br /><br />foreach (array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">) as </span><span style="color: #0000BB">$row</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Mach was<br /></span><span style="color: #007700">}<br /><br />echo </span><span style="color: #0000BB">$ref</span><span style="color: #007700">; </span><span style="color: #FF8000">// 3 - letztes Element des durchlaufenen Arrays<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
     </p>
    </p></blockquote>
    <p class="para">
     Obgleich keine Referenzzuweisung im engeren Sinne, können Ausdrücke, die
     mit dem Sprachkonstrukt
     <a href="function.array.php" class="link"><code class="literal">array()</code></a> erstellt
     werden, sich ebenso verhalten, wenn dem hinzuzufügenden Array-Element
     <code class="literal">&amp;</code> vorangestellt wird. Beispiel:
     <div class="informalexample">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= array(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$arr </span><span style="color: #007700">= array(&amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">, &amp;</span><span style="color: #0000BB">$b</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">], &amp;</span><span style="color: #0000BB">$b</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]++;<br /></span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]++;<br /></span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]++;<br /></span><span style="color: #FF8000">/* $a == 2, $b == array(3, 4); */<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>
    <p class="para">
     Es ist allerdings zu beachten, dass Referenzen in Arrays potentiell
     gefährlich sind. Eine normale Zuweisung (also nicht per Referenz) mit
     einer Referenz auf der rechten Seite wandelt die linke Seite nicht in
     eine Referenz um, aber Referenzen innerhalb von Arrays bleiben bei
     solchen normalen Zuweisungen erhalten. Dies gilt ebenso für
     Funktionsaufrufe, bei denen das Array als Wertübergabe entgegengenommen
     wird. Beispiel:
     <div class="informalexample">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">/* Zuweisung skalarer Variablen */<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">7</span><span style="color: #007700">; </span><span style="color: #FF8000">// $c ist keine Referenz; keine Änderung an $a oder $b<br /><br />/* Zuweisung von Array-Variablen */<br /></span><span style="color: #0000BB">$arr </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]; </span><span style="color: #FF8000">// $a und $arr[0] sind in derselben Referenzmenge<br /></span><span style="color: #0000BB">$arr2 </span><span style="color: #007700">= </span><span style="color: #0000BB">$arr</span><span style="color: #007700">; </span><span style="color: #FF8000">// Keine Referenzzuweisung!<br /></span><span style="color: #0000BB">$arr2</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]++;<br /></span><span style="color: #FF8000">/* $a == 2, $arr == array(2) */<br />/* Der Inhalt von $arr hat sich geändert, obwohl es keine Referenz ist! */<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
     Anders ausgedrückt ist das Referenzverhalten von Arrays auf einer
     Element-für-Element-Basis definiert; das Referenzverhalten einzelner
     Elemente ist getrennt vom Referenzzustand des Array-Behälters.
    </p>
   </div>
   <div class="sect2" id="language.references.whatdo.pass">
    <h3 class="title">Referenzübergabe</h3>
    <p class="para">
     Eine weitere Einsatzmöglichkeit von Referenzen ist die Übergabe von
     Variablen an eine Funktion per Referenz. Hierbei beziehen sich sowohl der
     lokale Variablenname als auch der Variablenname der aufrufenden Instanz
     auf denselben Variableninhalt:
     <div class="informalexample">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">$var</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$var</span><span style="color: #007700">++;<br />}<br /><br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">=</span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
     Nach der Ausführung hat <var class="varname">$a</var> den Wert 6, da sich in der
     Funktion <var class="varname">foo</var> der Variablenname <var class="varname">$var</var>
     auf denselben Variableninhalt bezieht wie <var class="varname">$a</var>. Weitere
     Information hierzu sind dem Abschnitt
     <a href="language.references.pass.php" class="link">Referenzübergabe</a> zu
     entnehmen.
    </p>
   </div>
   <div class="sect2" id="language.references.whatdo.return">
    <h3 class="title">Referenzrückgabe</h3>
    <p class="para">
     Als Drittes bieten Referenzen die Möglichkeit, Werte aus Funktionen heraus
     <a href="language.references.return.php" class="link">per Referenz zurückzugeben</a>.
    </p>
   </div>
  </div><?php manual_footer($setup); ?>