Мне было интересно, почему php не жалуется, когда ссылается на несуществующую переменную (будучи простой переменной или массивом), так ли это, или есть что-то еще, чего я не вижу? Например, этот код
<?php $t = &$r["er"]; var_dump($r); ?>
не предупреждает о несуществующей переменной.
Кроме того, var_dump
показывает это:
array(1) { ["er"]=> &NULL }
что &NULL
– это то, чего я действительно не ожидал, я думал, что получаю простой NULL
.
Заранее спасибо!
Если память ссылок на PHP-интерпретатор PHP корректна, PHP создаст нулевой элемент в хэш-таблице с ключом, подобным тому, который вы отправили, и ссылайтесь на него. Это видно из следующего теста:
<?php $i = 0; $arr = []; $arrS = null; $v = memory_get_peak_usage(); for ($i = 0; $i < 150; $i++) { $arrS = &$arr[rand()]; } $v = memory_get_peak_usage() - $v; echo $v;
До размера кучи по умолчанию PHP будет возвращать точно дополнительную память 0 – поскольку он все еще выделяет уже «подготовленные» элементы массива (PHP хранит несколько лишних элементов хеш-таблицы пустым, но назначается для повышения производительности). Вы можете увидеть это, установив его в диапазоне от 0 до 16 (это размер кучи!).
Когда вам будет больше 16, PHP придется выделять дополнительные элементы и будет делать это на i = 17, i = 18 и т. Д., Создавая нулевые элементы, чтобы ссылаться на них.
PS: вопреки тому, что говорили люди, это НЕ бросает ошибку, предупреждение или уведомление. Вызов пустого элемента без ссылки – ссылаться на несуществующий элемент нет. Большая большая БОЛЬШАЯ разница.
не предупреждает о несуществующей переменной.
Вот как работают ссылки. $a = &$b;
создает $b
если он еще не существует, «для справки в будущем», если хотите. Это то же самое, что и в параметрах, которые передаются по ссылке. Может быть, это выглядит вам знакомым:
preg_match($pattern, $string, $matches);
Здесь третий параметр является ссылочным параметром, поэтому $matches
match не должен существовать во время вызова метода, но он будет создан.
что & NULL – это то, чего я действительно не ожидал, я думал, что получаю простой NULL.
Почему ты этого не ожидал? $r['er']
является ссылкой «to / from» $t
. Обратите внимание, что ссылки не являются указателями, $r['er']
и $t
являются равными ссылками на одно и то же значение, нет направления от одного к другому (отсюда кавычки в последнем предложении).