<?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.whatdo.php',
    1 => '&iquest;Qu&eacute; hacen las referencias?',
    2 => '&iquest;Qu&eacute; hacen las referencias?',
  ),
  'up' => 
  array (
    0 => 'language.references.php',
    1 => 'Las referencias',
  ),
  'prev' => 
  array (
    0 => 'language.references.whatare.php',
    1 => '&iquest;Qu&eacute; es una referencia?',
  ),
  'next' => 
  array (
    0 => 'language.references.arent.php',
    1 => 'Lo que las referencias no son',
  ),
  '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.whatdo" class="sect1">
  <h2 class="title">¿Qué hacen las referencias?</h2>
  <p class="para">
   Existen tres principales usos de las referencias:
   la <a href="language.references.whatdo.php#language.references.whatdo.assign" class="link">asignación por
   referencia</a>, el <a href="language.references.whatdo.php#language.references.whatdo.pass" class="link">paso
   por referencia</a>
   y el <a href="language.references.whatdo.php#language.references.whatdo.return" class="link">retorno por
   referencia</a>. Esta sección introducirá estas operaciones, con enlaces
   a más detalles.
  </p>
  <div class="sect2" id="language.references.whatdo.assign">
   <h3 class="title">Asignación por referencia</h3>
   <p class="para">
    En este primer caso, las referencias PHP permiten que dos variables referencien el mismo contenido.
    Por ejemplo:
    <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>
    Esta escritura indica que <var class="varname">$a</var> y <var class="varname">$b</var>
    apuntan al mismo contenido.
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      <var class="varname">$a</var> y <var class="varname">$b</var> son completamente
      iguales aquí: no es <var class="varname">$a</var> quien apunta a
      <var class="varname">$b</var>, o viceversa. Son <var class="varname">$a</var>
      y <var class="varname">$b</var> quienes apuntan al mismo contenido.
     </p>
    </p></blockquote>
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Si se asigna, pasa o devuelve una variable indefinida por referencia,
     se creará automáticamente.
     <div class="example" id="example-1">
      <p><strong>Ejemplo #1 Uso de referencias con variables indefinidas</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 es "creada" y asignada a NULL<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">
    La misma sintaxis puede ser utilizada con las funciones que
    devuelven referencias:
    <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">
    Utilizar la misma sintaxis con una función que <em>no</em>
    devuelve por referencia generará un error, al igual que utilizarla con el
    resultado del operador <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new</a>.
    Aunque los objetos se pasan como punteros, esto no es idéntico a las referencias como se explica en la sección los
    <a href="language.oop5.references.php" class="link">Objetos y referencias</a>.
   </p>
   <div class="warning"><strong class="warning">Advertencia</strong>
    <p class="para">
     Si se asigna una referencia a una variable declarada como <code class="literal">global</code>
     en una función, la referencia solo será visible dentro de la función.
     Se puede evitar esto utilizando el array <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>.
     <div class="example" id="example-2">
      <p><strong>Ejemplo #2 Referenciar variables globales desde funciones</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">"Variable Ejemplo"</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">// visible solo en la función<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">// visible también en el contexto global<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">"var2 está definido como '</span><span style="color: #0000BB">$var2</span><span style="color: #DD0000">'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// var2 está definido como ''<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">"var2 está definido como '</span><span style="color: #0000BB">$var2</span><span style="color: #DD0000">'\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// var2 está definido como 'Variable Ejemplo'<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
     Vea <code class="literal">global $var;</code> como un atajo para <code class="literal">$var
     =&amp; $GLOBALS[&#039;var&#039;];</code>. Por lo tanto, asignar otra referencia a
     <code class="literal">$var</code> solo modifica la referencia local de la variable.
    </p>
   </div>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Si se asigna un valor a una variable que tiene referencias en una estructura
     <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>, las referencias también serán modificadas.
     <div class="example" id="example-3">
      <p><strong>Ejemplo #3 Referencias y estructura foreach</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">// hacer algo<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 - el último elemento del array iterado<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>
   </p></blockquote>
   <p class="para">
    Aunque no es estrictamente una asignación por referencia, las expresiones
    creadas con la estructura de lenguaje
    <a href="function.array.php" class="link"><code class="literal">array()</code></a> pueden también
    comportarse como tales, prefijando con <code class="literal">&amp;</code> el elemento del array.
    Aquí hay un ejemplo:
    <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 /></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">
    Note que las referencias dentro de los arrays pueden resultar
    peligrosas. Utilizar una asignación normal (no por referencia) con una
    referencia a la derecha del operador no transforma la parte izquierda de la asignación
    en referencia, pero las referencias dentro de los arrays son preservadas. Esto
    se aplica también a las llamadas de funciones con un array pasado por valor. Ejemplo:
    <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">/* Asignación de variables escalares */<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 no es una referencia; no hay cambio en $a o $b<br /><br />/* Asignación de variables de tipo array */<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 y $arr[0] son referencias al mismo valor<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">// NO es una asignación por referencia!<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 />/* ¡Los contenidos de $arr son cambiados aunque no fuera una referencia! */<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    En otras palabras, desde el punto de vista de las referencias, el comportamiento de los arrays
    está definido elemento por elemento; el comportamiento
    de cada elemento
    es independiente del estado de referencia del array que los contiene.
   </p>
  </div>
  <div class="sect2" id="language.references.whatdo.pass">
   <h3 class="title">Paso por referencia</h3>
   <p class="para">
    El segundo interés de las referencias es
    permitir pasar variables por referencia. Esto se realiza haciendo
    referenciar el mismo contenido por una variable local a una función y por una
    variable del contexto llamante.
    Por ejemplo:
    <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 />  </span><span style="color: #0000BB">$var</span><span style="color: #007700">++;<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>
    Después de la ejecución de esta porción de código, <var class="varname">$a</var> vale 6.
    Esto se debe a que, en la función <var class="varname">foo</var>, la
    variable <var class="varname">$var</var> apunta al mismo contenido que
    <var class="varname">$a</var>.
    Para más información sobre este tema, se puede consultar la sección
    <a href="language.references.pass.php" class="link">paso por referencia</a>.
   </p>
  </div>
  <div class="sect2" id="language.references.whatdo.return">
   <h3 class="title">Retorno por referencia</h3>
   <p class="para">
    El tercer interés de las referencias es permitir el
    <a href="language.references.return.php" class="link">retorno de valores por
     referencia</a>.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>