Насколько строгим является неопределенный индекс?

Я включил все отчеты об ошибках, чтобы очистить некоторые неопределенные индексы, просто чтобы сделать приложение, которое я делаю, более аккуратным. Я заметил любопытное поведение:

Допустим, у меня есть следующий массив: $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 приведения типа, что приводит к такому результату.
(Подсказка: бедняга, который задал этот вопрос, имел глобальные регистры)

Другие вопросы по тегам