2010-11-16 4 views
5

Ho appena eseguito alcuni semplici test di debug sugli array e ho notato che quando eseguo un var_dump() di un array, l'output sta contrassegnando qualsiasi elemento dell'array a cui fa riferimento un'altra variabile. Come un semplice esperimento, ho eseguito il seguente codice:Osservazione inaspettata: var_dump() di un array indica gli elementi di riferimento ... da quando?

$array = range(1,4); 

var_dump($array); 
echo '<br />'; 

foreach($array as &$value) { 
} 

var_dump($array); 
echo '<br />'; 

$value2 = &$array[1]; 

var_dump($array); 
echo '<br />'; 

che dà il seguente risultato:

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> ∫(4) } 
array(4) { [0]=> int(1) [1]=> ∫(2) [2]=> int(3) [3]=> ∫(4) } 

Nota il simbolo ∫ fianco elemento 3 e, successivamente, elemento 1. Si noti, inoltre, che tali voci don' t mostra il tipo di dati della voce.

Dopo alcuni esperimenti, non vedo questo se var_dump un tipo scalare, o con oggetti o risorse. Se la matrice contiene dati di stringa, il simbolo è & (e mostra ancora il tipo di dati), analogamente con voci float, booleane e oggetto.

Questo è in esecuzione contro PHP 5.2.8

Prima domanda: Quando ha fatto questo inizio comportamento, o è qualcosa che semplicemente non ho notato prima d'ora?

Seconda domanda: se gli elementi di riferimento possono essere contrassegnati in questo modo da var_dump(), c'è una funzione nel core PHP che mi consentirà di identificare se un elemento di matrice è referenziato da un'altra variabile; o che restituirà il refcount o l'indicatore di riferimento da una _zval_struct?

risposta

4

Non sono sicuro se questo risponde alla tua domanda, ma è possibile utilizzare

debug_zval_dump($array); 

per ottenere il refcount:

array(4) refcount(2){ 
    [0]=> long(1) refcount(1) 
    [1]=> &long(2) refcount(2) 
    [2]=> long(3) refcount(1) 
    [3]=> &long(4) refcount(2) 
} 

Vedi anche Article by Derick Rethans (PHP Core Dev) about Refcounting.

Problemi correlati