2010-05-15 17 views
9

Se faccio una copia di una variabile di riferimento. La nuova variabile è un puntatore o mantiene il valore della variabile a cui si riferiva il puntatore?PHP: creazione di una copia di una variabile di riferimento

+0

riferimenti non sono puntatori . Vedere http://php.net/manual/en/language.references.arent.php – Artefacto

+0

A volte è necessario utilizzarli, ad esempio quando si implementa l'offset. Anche se senza dubbio i riferimenti in PHP sono un disastro. – Artefacto

risposta

6

Detiene il valore. Se si voleva puntare, utilizzare l'operatore & per copiare un altro riferimento:

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

Non dire "punto". penserà che ci sia qualche differenza tra $ a, $ b e $ c (come un puntatore e un punto). – Artefacto

5

Facciamo un test rapido:

<?php 

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

$copy = 'world'; 

echo $base; 

uscita è hello, quindi $copy non è un riferimento a %base.

+2

Quale dovrebbe essere previsto - il punto di '$ ref' è un riferimento a' $ base' è che '$ copy = $ ref' dovrebbe avere lo stesso effetto di' $ copy = $ base'. – Tgr

+0

Questo mi ha fatto capire molto meglio i riferimenti. Per qualche ragione, credo che per copiare un riferimento potresti '$ copy = $ ref;'. Ora capisco che è come un dereferenziamento e copia i dati a cui fa riferimento il riferimento. Penso che l'uso di puntatori C rende questo confuso come devi dereferenziare manualmente. – Lightbulb1

+0

@ Lightbulb1: Questo perché i riferimenti di PHP sono più come riferimenti C++ che puntatori C/C++. ;) – Crozin

-1

Permettetemi di Murk l'acqua con questo esempio:

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

} 
print_r($a); 

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

uscita:

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

1 
2 
3 
3 

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

Puoi trovare la risposta qui: http://stackoverflow.com/a/14854568/1353874 – miro

+0

Il tuo esempio è ** intenzionalmente confuso **. dopo 'foreach ($ qualsiasi cosa come & $ v) {}' variabile '$ v' manterrà il riferimento all'ultimo elemento dell'array (mentre questo è confuso, è un comportamento corretto), dovresti o 'unset ($ v)' o mantenere in mente che '$ v' è un riferimento. ** Suggerimento: usa var_dump() invece di print_r(), mostrerà & riferimenti negli array ** –

Problemi correlati