Неожиданное наблюдение: 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 скалярный тип, или с объектами или ресурсами. Если массив содержит строковые данные, символ является символом & (и он все еще показывает тип данных), также как и с элементами float, boolean и object.

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

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

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

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

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

Также см. Эту статью Derick Rethans (PHP Core Dev) о Refcounting .