2013-08-10 9 views
5

Nikić erklärte in another thread:Warum erhöht foreach refcount um 2 statt um 1?

Kurz vor [foreach] Iteration der $array wird in foreach für Verwendung "soft kopiert". Dies bedeutet, dass keine tatsächliche Kopie gemacht wird, sondern nur die refcount des zval von $array erhöht sich auf 2.

aber mein Testcode ist ein anderes Ergebnis zeigt:

$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? 

Nur durch Wenn wir uns den Code anschauen, können wir höchstens zwei Array-Variablen sehen.

Warum ist refcount 3?

Warum wird refcount 2 nicht nach foreach ausgeführt?

+0

In Ihrer Foreach-Schleife sollten Sie nicht auf Ihr Array-Element mit der $ value-Variable verweisen? – Crackertastic

+0

@Crackertastic, ich verwende keine Variablen innerhalb der Schleife. – Pacerier

+1

Ich bekomme 'refcount' 2, verpasse ich etwas? '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

Antwort

1

Der xdebug_debug_zval() untersucht die Variable $ array und nicht die Schlüsselvariable $. wenn Sie Ihren Code ändern:

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

} 

Die korrekten Werte des Arrays zurückgegeben. Ich habe die Funktion xdebug nicht, so dass ich nicht testen kann, welchen Wert Sie dort eingeben.

+0

Ich habe deinen Code getestet und 'xdebug_debug_zval ('array');' zeigt immer noch '3' anstelle von' 2'. Ich teste nicht die Werte des Arrays, sondern den Refcount des Arrays. – Pacerier

+0

OK. In der foreach-Schleife müssen Sie den xdebug ... -Wert ändern. Im Moment betrachten Sie immer das gesamte Array und nicht das Element im Array. – jeff

+0

Ich möchte nicht auf das Element im Array schauen .... Ich schaue auf das Array, weil * das * ist, worum diese Frage geht. Warum gibt das Array refcount 3 statt 2? – Pacerier