Можно ли использовать массив [ключ] в PHP? - PullRequest
23 голосов
/ 09 марта 2010

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

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

Ответы [ 6 ]

42 голосов
/ 09 марта 2010

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


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

echo $array[key];

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


Но, если в вашем коде есть что-то подобное ранее:

define('key', 'glop');

Это не займет

echo $array['key'];

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

echo $array['glop'];


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

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

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


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

6 голосов
/ 09 марта 2010

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

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

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

4 голосов
/ 20 февраля 2011

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

$var = $array[bar];

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

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

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

3 голосов
/ 09 марта 2010

Из Руководства по PHP - Почему $ foo [bar] не так?

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

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

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

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

2 голосов
/ 09 марта 2010

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

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

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

2 голосов
/ 09 марта 2010

Это плохая практика не заключать в кавычки значения ключа по ряду причин:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...