Почему php не жалуется при ссылке на несуществующую переменную?

Мне было интересно, почему 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 являются равными ссылками на одно и то же значение, нет направления от одного к другому (отсюда кавычки в последнем предложении).