2010-05-15 12 views
9

Si hago una copia de una variable de referencia. ¿La nueva variable es un puntero o contiene el valor de la variable a la que se refería el puntero?PHP: hacer una copia de una variable de referencia

+0

Las referencias no son punteros . Consulte http://php.net/manual/en/language.references.arent.php – Artefacto

+0

Algunas veces debe usarlas, por ejemplo, al implementar el offsetget. Aunque no cabe duda de que las referencias en PHP son un desastre. – Artefacto

Respuesta

6

Tiene el valor. Si usted quiere señalar, utilice el operador & copiar otra referencia:

 
$a = 'test'; 
$b = &$a; 
$c = &$b; 
+0

No digas "punto". pensará que hay alguna diferencia entre $ a, $ b y $ c (como un puntero y un apuntado). – Artefacto

5

Vamos a hacer una prueba rápida:

<?php 

$base = 'hello'; 
$ref =& $base; 
$copy = $ref; 

$copy = 'world'; 

echo $base; 

salida es hello, por lo tanto, $copy no es una referencia a %base.

+2

Lo que debería esperarse: el punto de que '$ ref' sea una referencia a' $ base' es que '$ copy = $ ref' debe tener exactamente el mismo efecto que' $ copy = $ base'. – Tgr

+0

Esto me hizo entender las referencias mucho mejor. Por alguna razón, pensé que para copiar una referencia podría '$ copy = $ ref;'. Ahora entiendo que es como una desreferencia y copia los datos a los que hace referencia la referencia. Creo que el uso de punteros C hace que esto sea confuso, ya que tiene que eliminar la referencia manualmente. – Lightbulb1

+0

@ Lightbulb1: Esto se debe a que las referencias de PHP son más parecidas a las referencias de C++ que a las de C/C++. ;) – Crozin

-1

Let Me MURK el agua con este ejemplo:

$a = array (1,2,3,4); 
foreach ($a as &$v) { 

} 
print_r($a); 

foreach ($a as $v) { 
    echo $v.PHP_EOL; 
} 
print_r($a); 

Salida:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
) 

1 
2 
3 
3 

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 3 
) 
+0

Puede encontrar la respuesta aquí: http://stackoverflow.com/a/14854568/1353874 – miro

+0

Su ejemplo es ** intencionalmente confuso **. después de que 'foreach ($ cualquier cosa como & $ v) {} 'variable' $ v' mantendrá la referencia al último elemento de la matriz (mientras esto es confuso, es el comportamiento correcto), debe 'unset ($ v)' o keep en mente que '$ v' es una referencia. ** Pro-tip: use var_dump() en lugar de print_r(), mostrará & referencias en matrices ** –

Cuestiones relacionadas