2014-03-12 68 views
3

雖然與Xdebug的的引用計數功能發揮,我碰到這種奇怪的行爲:PHP的foreach如何處理引用?

$a = array('foo', 'bar'); 
xdebug_debug_zval('a'); 

foreach ($a as $key => $s) { 
    xdebug_debug_zval('a'); 
    echo "$s\n"; 
    unset($a[$key]); 
    xdebug_debug_zval('a'); 
} 

輸出是:

a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar') 
a: (refcount=3, is_ref=0)=array (0 => (refcount=2, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar') 
foo 
a: (refcount=1, is_ref=0)=array (1 => (refcount=2, is_ref=0)='bar') 
a: (refcount=1, is_ref=0)=array (1 => (refcount=3, is_ref=0)='bar') 
bar 
a: (refcount=1, is_ref=0)=array() 

爲什麼的arefcount跳起來三個?也許是因爲每個本地$s都保留一個參考?如果這是保存的情況?然後我發現refcount對於數組的第一個或第二個項目增加1,具體取決於正在執行的循環。但是爲什麼第二個項目的refcount在我取消第一個項目後增加了一個?

顯然,現在我要實現的目標是:

$a = array('foo', 'bar'); 
xdebug_debug_zval('a'); 

$tot = count($a); 
for ($i = 0; $i < $tot; $i++) { 
    xdebug_debug_zval('a'); 
    echo $a[$i]."\n"; 
    unset($a[$i]); 
    xdebug_debug_zval('a'); 
} 

其中有這樣的輸出:

a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar') 
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)='foo', 1 => (refcount=1, is_ref=0)='bar') 
foo 
a: (refcount=1, is_ref=0)=array (1 => (refcount=1, is_ref=0)='bar') 
a: (refcount=1, is_ref=0)=array (1 => (refcount=1, is_ref=0)='bar') 
bar 
a: (refcount=1, is_ref=0)=array() 

是否有可能實現使用foreach這樣的結果?

+0

本文不提‘的foreach’,但在解釋PHP引用詳情。比我們大多數人需要的更詳細,但似乎相當完整; -/[PHP引用解釋](http://derickrethans.nl/talks/phparch-php-variables-article.pdf) –

回答

0

請嘗試以下方法得到什麼是在後臺準備一個把手:

print_r(array_keys(get_defined_vars())); 
print_r(array_values(get_defined_vars())); 

它將輸出在腳本中任何指定點的所有賦值的變量。嘗試將它移動到文件中的不同位置。查看更改並相應地進行調整。

0

另外,如果你想只引用到工作,那麼你可以簡單地處理variable.strong文本之前加上「&」(符號)標誌