2010-03-08 3 views
23

Можно ли использовать массив без одиночной или двойной котировки, такой как $ array [key]? Я думал, что это плохо, потому что PHP сначала ищет константу, если я не использую ни одну, ни двойную цитату. Один из моих коллег сказал мне, что это не имеет значения.Можно ли использовать массив [key] в PHP?

Что вы, ребята, думаете?

+3

Возможно, ваш коллега означал, что неважно, использовать ли одинарные или двойные кавычки? Потому что это было бы более или менее верно (за исключением того, что переменные не обрабатываются в одинарных кавычках.) –

ответ

42

Это не считается OK - даже если он будет работать в большинстве случаев.


В основном, когда PHP видит это:

echo $array[key]; 

Он будет искать постоянный, определяемый с define, называемым key - и, если его нет, если будет принимать значения 'key' ,


Но, если есть что-то вроде этого в начале кода:

define('key', 'glop'); 

Это не займет

echo $array['key']; 

больше; вместо этого, он будет использовать значение key постоянной - и ваш код будет таким же, как:

echo $array['glop']; 


В конце концов, не ставя кавычки Arround имя ключа плохо, по крайней мере, две причины:

  • Там есть риск, что он не будет делать то, что вы ожидаете - что очень плохо
    • Возможно, сегодня ...
    • Но как насчет следующей недели/месяца/года?
    • Может быть, один день, вы будете define константа с именем неправильно ;-)
  • Это не хорошо для производительности:
    • он должен искать константу, перед использованием 'key'
    • и, как сказано в комментарии, он генерирует уведомления (даже если отключить error_reporting и display_errors, уведомлений/предупреждения/ошибки все еще генерируется, даже если отбросить позднее)

Итак, вы не должны слушать этот парень на данный момент: он не так: это имеет значения.


И если вам нужно «доказательство», что это «лучше», чем то, что люди могут сказать вам, на StackOverflow, вы можете указать его в этот раздел руководства, в качестве ссылки: Why is $foo[bar] wrong?

+3

Кроме того, каждый раз, когда PHP видит этот синтаксис, он генерирует E_NOTICE, который имеет некоторые служебные издержки. И, вероятно, выкладывает какой-то спам в ваш журнал. Потому что вы должны регистрировать и разрешать ошибки уровня уведомлений. –

+3

+1 не используя кавычки для ключей массива, является глупым и может вызвать проблемы в один день. –

+0

@Frank: true; еще одна веская причина использовать цитаты, когда они должны быть там! –

2

Это bad practice не процитировать ключевые ценности, по целому ряду причин:

  1. Потенциальные столкновения с значимыми именами символов, таких как define «D константы.
  2. Некоторые ключи не могут быть выражены без кавычек (например, ключ "]").
  3. Плохие привычки могут укусить вас позже (а именно в отношении № 1 и № 2).
  4. Производительность - поиск define занимает время.

Если Вы желаете, чтобы не вводить в кавычках имен, которые являются только стандартными элементами вещи вы передаете вокруг много, может быть, вы, возможно, захотите использовать объекты вместо этого, которые принимают синтаксис object->property вместо $array["element"] синтаксис.

2

Если только ключ на самом деле является константой, нет причин для того, чтобы вы не клали кавычки вокруг ключа.

Как работает PHP, он ищет постоянное значение того, что вы положили, но оно принимает строковое представление, если константа не может быть найдена.

Если кто-то должен был отредактировать ваш код по дороге и добавить константу с этим ключевым именем, это просто вызовет больше головных болей.

6

Это не хорошо и добавить к тому, что другие сказали, это вызовет ошибку в большинстве случаев:

8 Notice Use of undefined constant key - assumed 'key' in file: 'index.php' on line 46 

См раздел в PHP Manual для «Почему $ Foo [бар] неправильно?" под «массиву и что нельзя делать» на этой странице: http://php.net/manual/en/language.types.array.php

3

От PHP Manual - Why is $foo[bar] wrong?

Всегда используйте кавычки буквального индекса массива строк. Например, $ foo ['bar'] верен, а $ foo [bar] - нет. Но почему? Обычно сталкиваются с такого рода синтаксис в старых скриптах:

<?php 
$foo[bar] = 'enemy'; 
echo $foo[bar]; 
// etc 
?> 

Это неправильно, но это работает. Причина в том, что этот код имеет неопределенную константу (bar), а не строку («bar» - заметьте кавычки). PHP может в будущем определять константы, которые, к сожалению, для такого кода имеют одно и то же имя. Это работает, потому что PHP автоматически преобразует голую строку (некорректную строку, которая не соответствует известному символу) в строку, содержащую голую строку. Например, если нет определенной константы с именем bar, тогда PHP будет заменять строку «bar» и использовать ее.

В руководстве вы найдете еще несколько примеров для ознакомления.

4

Это неправильно и будет автоматически определить константу:

$var = $array[bar]; 

Это использование однако правильно:

$var = "string $array[bar] ..."; 

Для совместимости с PHP2 этот старый синтаксис еще разрешено в строковом контексте. Цитирование ключа приведет к ошибке синтаксического анализа, если вы также не используете {фигурные скобки} вокруг него.