Если бы я опустил одинарные кавычки в $_variable ['variable']?

Возможный дубликат:Доступ к массивам без цитирования ключа

Я заметил там тонкую разницу... если бы я должен был кодировать это:

echo "Welcome, $_SESSION['username'], you are logged in.";

Это не удастся при разборе. Однако, если код такой:

echo "Welcome, $_SESSION[username], you are logged in.";

Это работает как ожидалось, что заставляет меня задаться вопросом, действительно ли нужны одинарные кавычки? Я не могу найти что-либо в документации PHP, показывающей этот эффект.

6 ответов

В PHP глобальная константа, которая не определена становится строкой.

Не полагайтесь на это; всегда цитируйте ключи массива.

Однако, интерполированный в строку, это хорошо, поскольку это уже строка.

Konforce дает хорошее замечание в комментариях об использовании фигурных скобок в интерполяции строк.

Если вы их опустите, не цитируйте ключ.

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


Этот способ неправильный, но работает $_SESSION[username] и занимает больше времени, чтобы проанализировать значение этого ассоциативного индекса.

Эффект производительности PHP

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

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


Пожалуйста, проверьте этот документ

в разделе Array do and don'ts

<!--?php
// Show all errors
error_reporting(E_ALL);
$arr = array('fruit' =--> 'apple', 'veggie' => 'carrot');
// Correct
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrect. This works but also throws a PHP error of level E_NOTICE because
// of an undefined constant named fruit
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// This defines a constant to demonstrate what going on. The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');
// Notice the difference now
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// The following is okay, as it inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]"; // Hello apple
// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using superglobals in strings as well
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// Concatenation is another option
print "Hello " . $arr['fruit']; // Hello apple
?>


Внутри строки у вас есть, чтобы опустить одинарные кавычки или обернуть всю переменную в {} ("...{$array['key']}..." или ...$array[key]...). Тем не менее, обертывание настоятельно рекомендуется предотвращать проблемы при наличии чего-то вроде "...$foobar...", где вы действительно хотели "...{$foo}bar..." (т.е. Var $foo, за которым следует bar).

Но вы, возможно, не захотите использовать встроенные vars вообще, но правильно завершите строку: '...' . $var . '...'


да. Если вы передадите аргумент для массива без кавычек, php сначала попытается интерпретировать аргумент как константу, а если он не определен, он будет действовать как ожидалось. Даже если он может дать тот же результат, он значительно медленнее что приведенный аргумент. Вот пример того, когда это может не работать:

define("a_constant","a value");
$a = array("a_constant"=>"the right value");
echo $a[a_constant];

Переменная a_constant имеет значение "значение", поэтому $a[a_constant] переходит в $a["a value"], ключ, который не существует в массиве $a.


Он называл голые строки, как упоминалось, как ни странно, в документации массива . Если константа не найдена в соответствии с голой строкой - она ​​по историческим причинам является строковым литералом. Однако этот синтаксис связан с множеством синтаксических проблем, в которые я не буду входить, и читаемость здесь является проблемой. Читатель сам задает вопрос - это константа или строка?

Современные версии PHP выдает предупреждение для этого синтаксиса, чтобы помочь устранить эту проблему, используя строки с одиночным цитированием ( "имя пользователя" ).

licensed under cc by-sa 3.0 with attribution.