<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.references.return.php',
    1 => 'Devolver referencias',
    2 => 'Devolver referencias',
  ),
  'up' => 
  array (
    0 => 'language.references.php',
    1 => 'Las referencias',
  ),
  'prev' => 
  array (
    0 => 'language.references.pass.php',
    1 => 'Paso por referencia',
  ),
  'next' => 
  array (
    0 => 'language.references.unset.php',
    1 => 'Destruir una referencia',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Devolver referencias</h2>
  <p class="para">
   Devolver referencias es útil cuando se
   quiere utilizar una función para determinar a qué variable
   debe estar ligada una referencia.
   No utilice <em>no</em>
   el retorno por referencia para mejorar el rendimiento,
   el motor es suficientemente robusto para optimizar esto
   internamente. Devuelva referencias solo
   cuando haya buenas razones técnicas
   para hacerlo. Para devolver referencias, utilice esta sintaxis:
   <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 es una referencia de $obj-&gt;value, que vale 42.<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">// muestra el nuevo valor de $obj-&gt;value, es decir, 2.<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   En este ejemplo, se asigna un valor a la propiedad del objeto
   devuelta por la función <var class="varname">getValue</var>, y no a su copia,
   como sería el caso si no se hubiera utilizado la sintaxis de referencia.
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    A diferencia del paso de parámetro, aquí, se debe utilizar
    <code class="literal">&amp;</code> en ambos lugares, tanto para
    indicar que se devuelve por referencia (no por copia), como
    para indicar que también se asigna por referencia (no por copia
    tampoco) para la variable <var class="varname">$myValue</var>.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    Si se intenta devolver una referencia desde una función
    con la sintaxis: <code class="literal">return ($this-&gt;value);</code>,
    esto no funcionará <em>no</em> como
    se espera, y devolverá el resultado de la <em>expresión</em>,
    y no de la variable, por referencia. Solo se pueden devolver
    variables por referencia desde una función, y nada más.
   </span>
  </p></blockquote>
  <p class="para">
   Para utilizar la referencia devuelta, se debe utilizar la asignación
   por referencia:
   <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">// Ahora, la variable $collection es una variable por referencia que referencia el array static dentro de la función<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">Nota</strong>: 
    <span class="simpara">
        Si la asignación se realiza sin el símbolo <code class="literal">&amp;</code>,
        por ejemplo <code class="code">$collection = collector();</code>,
        la variable <var class="varname">$collection</var> recibirá una copia del valor,
        y no la referencia devuelta por la función.
    </span>
   </p></blockquote>
   Para pasar la referencia devuelta a otra función que espera una referencia,
   se puede utilizar la siguiente sintaxis:
   <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">Nota</strong>: 
   <span class="simpara">
    Note que <code class="literal">array_push(&amp;collector(), &#039;foo&#039;);</code>
    <em>no funcionará</em>, y resultará en un error
    fatal.
   </span>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>