Насколько строгим является неопределенный индекс?
Я включил все отчеты об ошибках, чтобы очистить некоторые неопределенные индексы, просто чтобы сделать приложение, которое я делаю, более аккуратным. Я заметил любопытное поведение:
Допустим, у меня есть следующий массив: $a = array('test' => false, 'foo' => 'bar')
Если я сделаю if ($a['nothere'])
Я правильно получил уведомление Undefined index: nothere
,
Однако, если я сделаю if ($a['test']['nothere'])
Я не получаю уведомления. Совсем. Несмотря на nothere
определенно не является индексом в $a['test']
,
Теперь, если я сделаю $a['test'] = array('baz' => 'poof')
, затем работает if ($a['test']['nothere'])
бросает уведомление.
Разве неопределенная проверка индекса не проверяет индексы в пустом массиве? Это на PHP 5.2.8.
1 ответ
Это из-за хитрого жонглирования. $a['test'] преобразуется в [пустую] строку, а затем 'никуда' преобразуется в 0, а затем PHP пытается найти символ 0 в пустой строке. Он становится операцией подстроки, а не поиском переменной, поэтому ошибка не возникает.
Ну и дела, мужчина говорит то же самое: http://php.net/manual/en/language.types.type-juggling.php
Любопытный пример из моего опыта:
Запрашивается по гиперссылке index.php?sname=p_edit&page=0
код
if (isset($_GET['sname'])) { $page['current'] = $_GET['sname'].'.php'; };
echo $page['current'];
производит только одну букву "p"
Я насчитал 6 шагов и 2 приведения типа, что приводит к такому результату.
(Подсказка: бедняга, который задал этот вопрос, имел глобальные регистры)