Почему $foo[bar] неверно?
Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива.
К примеру, пишите $foo['bar'], а не
$foo[bar]. Но почему? Часто в старых скриптах можно встретить
следующий синтаксис:
Это неверно, хотя и работает. Причина в том, что этот код содержит неопределенную
константу (bar), а не строку ('bar' - обратите внимание
на кавычки). Это работает, потому что PHP автоматически преобразует
"голую строку" (не заключенную в кавычки строку,
которая не соответствует ни одному из известных символов языка) в строку
со значением этой "голой строки". Например, если константа с именем bar
не определена, то PHP заменит bar на
строку 'bar' и использует ее.
Замечание:
Это не означает, что нужно всегда заключать
ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это
помешает PHP обрабатывать их.
Результат выполнения данного примера:
Проверяем 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
Плохо:
Хорошо: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
Плохо:
Хорошо: 1
Проверяем 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
Плохо:
Хорошо: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
Плохо:
Хорошо: 2
Дополнительные примеры, демонстрирующие этот факт:
Если вы переведете error_reporting
в режим отображения ошибок уровня
E_NOTICE (например, такой как
E_ALL), вы сразу увидите эти ошибки. По
умолчанию
error_reporting установлена их не отображать.
Как указано в разделе синтаксис,
внутри квадратных скобок ('['
и ']') должно быть выражение. Это означает, что можно писать вот так:
Это пример использования возвращаемого функцией значения
в качестве индекса массива. PHP известны также и константы:
Обратите внимание, что E_ERROR - это такой же
верный идентификатор, как и bar в первом примере.
Но последний пример по сути эквивалентен такой записи:
поскольку E_ERROR соответствует 1, и т.д.
Так что же в этом плохого?
Когда-нибудь в будущем, команда разработчиков PHP, возможно, пожелает
добавить еще одну константу или ключевое слово, либо константа из
другого кода может вмешаться и тогда у вас могут
возникнуть проблемы. Например, вы уже не можете использовать таким
образом слова empty и
default, поскольку они являются
зарезервированными ключевыми словами.
Замечание:
Повторим, внутри строки (string), заключенной
в двойные кавычки, корректно не окружать индексы
массива кавычками, поэтому "$foo[bar]"
является верной записью. Более подробно почему - смотрите
вышеприведенные примеры, а также раздел
обработка
переменных в строках.