Неожиданное наблюдение: var_dump () массива помечает ссылочные элементы ... с каких пор? - PullRequest
6 голосов
/ 16 ноября 2010

Я только что выполнил несколько простых тестов отладки для массивов и заметил, что когда я выполняю var_dump () массива, вывод помечает любой элемент в массиве, на который ссылается другая переменная. В качестве простого эксперимента я запустил следующий код:

$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 />';

, который дает следующий вывод:

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) } 

Обратите внимание на символ along рядом с элементом 3 и впоследствии с элементом 1. Обратите внимание, что эти записи не показывают тип данных записи.

После некоторых экспериментов, я не вижу этого, если я var_dump скалярного типа, или с объектами или ресурсами. Если массив содержит строковые данные, символом является & (и он все еще показывает тип данных), также с записями типа float, boolean и object.

Это работает с PHP 5.2.8

Первый вопрос: когда это поведение началось, или я просто не замечал этого раньше?

Второй вопрос: если ссылочные элементы могут быть помечены таким образом с помощью var_dump (), есть ли какая-либо функция в ядре PHP, которая позволит мне определить, ссылается ли элемент массива на другую переменную; или это вернет refcount или ref флаг из _zval_struct?

1 Ответ

4 голосов
/ 16 ноября 2010

Не уверен, что это ответ на ваш вопрос, но вы можете использовать

debug_zval_dump($array);

, чтобы получить счет:

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

Также смотрите эту статью Дерика Ретанса (PHPCore Dev) о пересчете .

...