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