Неожиданное наблюдение: var_dump () массива помечает ссылочные элементы, с каких это пор?

Я только что запустил несколько простых тестов отладки для массивов и заметил, что когда я выполняю 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) } 

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

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

Это работает против PHP 5.2.8

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

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


person Mark Baker    schedule 16.11.2010    source источник


Ответы (1)


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

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

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

person Gordon    schedule 16.11.2010