<?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.return.php',
    1 => 'Referenzen zur&uuml;ckgeben',
    2 => 'Referenzen zur&uuml;ckgeben',
  ),
  'up' => 
  array (
    0 => 'language.references.php',
    1 => 'Referenzen',
  ),
  'prev' => 
  array (
    0 => 'language.references.pass.php',
    1 => 'Parameter&uuml;bergabe per Referenz',
  ),
  'next' => 
  array (
    0 => 'language.references.unset.php',
    1 => 'Referenzen aufheben',
  ),
  '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.return" class="sect1">
   <h2 class="title">Referenzen zurückgeben</h2>
   <p class="para">
    Das Zurückgeben von Ergebnissen per Referenz aus Funktionen heraus kann
    manchmal recht nützlich sein, um herauszufinden, an welche Variable eine
    Referenz gebunden werden soll. Man sollte diese Funktionalität
    <em>nicht</em> aus Performancegründen benutzen, der Kern ist
    intelligent genug, um dies selbst zu optimieren. Man sollte Referenzen nur
    dann zurückgeben, wenn man sinnvolle technische Gründe hat. Hierbei ist
    folgende Syntax zu verwenden:
    <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">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$value </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br /><br />    public function &amp;</span><span style="color: #0000BB">getValue</span><span style="color: #007700">()<br />    {<br />        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$myValue </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getValue</span><span style="color: #007700">(); </span><span style="color: #FF8000">// $myValue ist eine Referenz auf $obj-&gt;value, was den Wert 42 hat<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">value </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$myValue</span><span style="color: #007700">;                </span><span style="color: #FF8000">// Zeigt den neuen Wert von $obj-&gt;value, also 2.<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
     In diesem Beispiel weisen wir der Eigenschaft des von der Funktion
     <var class="varname">getValue</var> zurückgegebenen Objekts einen Wert zu, und
     nicht seiner Kopie, wie es der Fall wäre, wenn wir nicht die
     Referenzsyntax verwendet hätten.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Im Gegensatz zur Parameterübergabe ist hier an beiden Stellen die Angabe
     des <code class="literal">&amp;</code> notwendig. Dies zeigt an, dass Sie eine
     Referenz und keine Kopie zurückgeben. Ebenfalls wird angezeigt, dass für
     <var class="varname">$myValue</var> im Gegensatz zur normalen Zuweisung eine
     Referenzbindung durchgeführt werden soll.
    </span>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Wenn man versucht, eine Referenz aus einer Funktion mit der Syntax
     <code class="literal">return ($this-&gt;value);</code> zurückzugeben, wird das
     <em>nicht</em> funktionieren, weil man versucht, das Ergebnis
     eines <em>Ausdrucks</em> zurückzugeben und nicht eine
     Variable per Referenz. Man kann nur Variablen per Referenz aus einer
     Funktion zurückgeben - sonst nichts.
    </span>
   </p></blockquote>
   <p class="para">
    Um die zurückgegebene Referenz zu verwenden, muss Referenzzuweisung
    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 /></span><span style="color: #007700">function &amp;</span><span style="color: #0000BB">collector</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$collection </span><span style="color: #007700">= array();<br />    return </span><span style="color: #0000BB">$collection</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$collection </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">collector</span><span style="color: #007700">();<br /></span><span style="color: #FF8000">// Jetzt ist $collection eine referenzierte Variable, die auf das statische<br />// Array innerhalb der Funktion verweist<br /><br /></span><span style="color: #0000BB">$collection</span><span style="color: #007700">[] = </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">collector</span><span style="color: #007700">());<br /></span><span style="color: #FF8000">// Array<br />// (<br />//    [0] =&gt; foo<br />// )<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Wenn die Zuweisung ohne das <code class="literal">&amp;</code>-Symbol erfolgt, z. B.
     <code class="code">$collection = collector();</code>, erhält die Variable
     <var class="varname">$collection</var> eine Kopie des Wertes und nicht die von der
     Funktion zurückgegebene Referenz.
    </span>
   </p></blockquote>
    Um die zurückgegebene Referenz an eine andere Funktion zu übergeben, die
    eine Referenz erwartet, kann diese Syntax verwendet werden:
    <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 &amp;</span><span style="color: #0000BB">collector</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$collection </span><span style="color: #007700">= array();<br />    return </span><span style="color: #0000BB">$collection</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">array_push</span><span style="color: #007700">(</span><span style="color: #0000BB">collector</span><span style="color: #007700">(), </span><span style="color: #DD0000">'foo'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Es ist zu beachten, dass
     <code class="literal">array_push(&amp;collector(), &#039;foo&#039;);</code>
     <em>nicht</em> funktioniert; es erzeugt einen fatalen Fehler.
    </span>
   </p></blockquote>
  </div><?php manual_footer($setup); ?>