2013-04-06 2 views
6

Мне было интересно, почему php не жалуется, когда ссылается на не существующую переменную (будучи простой переменной или массивом), так ли это, или есть что-то еще, чего я не вижу? Например, этот кодПочему php не жалуется при ссылке на несуществующую переменную?

<?php 
$t = &$r["er"]; 
var_dump($r); 
?> 

не проливает предупреждения о несуществующем переменном.

Кроме того, что var_dump показать это:

array(1) { ["er"]=> &NULL } 

что &NULL то, что я действительно не ожидал, я думал, что я хотел бы получить простой NULL.

Заранее благодарен!

+3

Ссылка на необъявленную переменную автоматически определяет ее имя в этой области. – mario

+0

@MarkBaker: Неправильно. Посмотрите мой ответ и/или запустите код, чтобы убедить себя.The & имеет значение. –

+0

Спасибо, Марио, я понял! – Melsi

ответ

5

Если память ссылки на интерпретатор 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 и т. Д., Создавая нулевые элементы, чтобы ссылаться на них.

P.S: вопреки тому, что говорят люди, это делает NOT Выводить ошибку, предупреждение или уведомление. Вызов пустого элемента без ссылки - ссылаться на несуществующий элемент нет. Большая большая БОЛЬШАЯ разница.

+0

Хороший ответ! +1. Я не узнал оператора '&' – hek2mgl

+0

. Там вы добавили очень впечатляющий фрагмент кода, для $ i <11 $ v echo ноль, очень полезно узнать о куче, размере по умолчанию и т. Д. Последняя строка в вашем ответе гласит: все это, теперь я знаю, что это «&» приведет к распределению. Это распределение (например, здесь: echo &$var;) приходит до эха, поэтому php не жалуется, потому что это то, что существует (был создан всего лишь шаг раньше)! Спасибо! – Melsi

1

не предупреждает о несуществующей переменной.

Вот как работают справки. $a = &$b; создает $b, если он еще не существует, «для справок в будущем», если хотите. Это то же самое, что и в параметрах, которые передаются по ссылке. Может быть, это выглядит знакомо:

preg_match($pattern, $string, $matches); 

Здесь третий параметр является ссылкой параметр, таким образом $matches не должен существовать на момент вызова метода, но он будет создан.

что & NULL - это то, чего я действительно не ожидал, я думал, что получаю простой NULL.

Почему вы этого не ожидали? $r['er'] является ссылкой «от/до» от $t. Обратите внимание, что ссылки не являются указателями, $r['er'] и $t являются равными ссылками на одно и то же значение, нет направления от одного к другому (отсюда кавычки в последнем предложении).

+0

+1 Это отличный ответ. Сэр! Особенно, когда вы упоминаете «preg_match» и «нет направления», эта самая информация о направлении - это то, чего я пропустил, и это уже помогло мне разобраться в деталях. К сожалению, я могу принять один ответ, мне было невозможно выбрать оба ответа больше, чем принято, мне нужно было выполнить эхо-ранд (1,2); чтобы выбрать, надеюсь, что за это я не наказан! Большое спасибо! Это «направление» было так хорошо учиться! – Melsi

Смежные вопросы