2013-08-10 21 views
5

Nikić stwierdzono w another thread:Dlaczego foreach zwiększa refcount o 2 zamiast 1?

Tuż przed [foreach] iteracja w $array jest "miękki skopiowane" na stosowania w foreach. Oznacza to, że żadna rzeczywista kopia jest wykonywana, ale tylko RefCount z zval z $array wzrasta do 2.

Jednak mój kod badanie pokazuje inny wynik:

$array = array(0, 1, 2); 
xdebug_debug_zval('array'); // refcount=1, is_ref=0 
          // so far so good 
foreach ($array as $key => $value) { 
    xdebug_debug_zval('array'); // refcount=3, is_ref=0 
}        // why is refcount 3 instead of 2? 

Wystarczy patrząc na kod, widzimy najwyżej dwie zmienne tablicowe.

Dlaczego jest refcount 3?

Dlaczego po foreach nie jest przeprowadzany przelicznik 2?

+0

W swojej pętli foreach nie powinieneś odwoływać się do elementu tablicy za pomocą zmiennej $ value? – Crackertastic

+0

@Crackertastic, nie używam żadnych zmiennych w pętli. – Pacerier

+1

Otrzymuję 'refcount' 2, czy czegoś brakuje? 'array: (refcount = 2, is_ref = 0) = array (0 => (refcount = 1, is_ref = 0) = 0, 1 => (refcount = 1, is_ref = 0) = 1, 2 => (refcount = 2, is_ref = 0) = 2) ' – vee

Odpowiedz

1

xdebug_debug_zval() szuka zmiennej $ tablica, a nie zmiennej $ key. jeśli zmienisz swój kod do:

foreach ($array as $key => $value) { 
    echo $key . " : " . $values . "<br>"; 
    //xdebug_debug_zval('array'); 

} 

zostaną zwrócone Prawidłowe wartości tablicy. Nie mam funkcji xdebug, więc nie mogę przetestować, jaką wartość tam wstawisz.

+0

Przetestowałem twój kod i 'xdebug_debug_zval ('array');' nadal pokazuje '3' zamiast' 2'. Nie testuję wartości tablicy, ale refcount tablicy. – Pacerier

+0

OK. Podczas gdy w pętli foreach będziesz musiał zmienić wartość xdebug ... W tej chwili zawsze patrzysz na całą tablicę, a nie na element w tablicy. – jeff

+0

Nie chcę patrzeć na element w tablicy .... Patrzę na tablicę, ponieważ * to * jest tym, o co chodzi. Dlaczego tablica podaje wartość ref. 3 zamiast 2? – Pacerier

Powiązane problemy