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