В чем разница между одинарными и двойными кавычками в PHP?


796

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

Я просто знаю, что в .NET или на языке C, если это в одинарных кавычках, это означает, что это символ, а не строка.

Ответы:


1086

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

  1. Строки в одинарных кавычках будут отображать вещи почти полностью "как есть". Переменные и большинство escape-последовательностей не будут интерпретироваться. Исключением является то, что для отображения буквальной одинарной кавычки вы можете экранировать ее обратной косой чертой \', а для отображения обратной косой черты вы можете экранировать ее другой обратной косой чертой \\( так что да, даже строки в одинарных кавычках анализируются ).
  2. Строки в двойных кавычках будут отображать множество экранированных символов (включая некоторые регулярные выражения), а переменные в строках будут оцениваться. Важным моментом здесь является то, что вы можете использовать фигурные скобки, чтобы изолировать имя переменной, которую вы хотите оценить . Например, скажем, у вас есть переменная,$typeи вы хотитеecho "The $types are". Это будет искать переменную$types. Чтобы обойти это использование,echo "The {$type}s are"вы можете поставить левую скобку до или после знака доллара. Посмотрите на разбор строк, чтобы увидеть, как использовать переменные-массивы и тому подобное.
  3. Heredoc синтаксис строки работает как строкидвойных кавычках. Это начинается с<<<. После этого оператора предоставляется идентификатор, затем новая строка. Далее следует сама строка, а затем снова тот же идентификатор, чтобы закрыть цитату. Вам не нужно избегать кавычек в этом синтаксисе.
  4. Синтаксис строки Nowdoc (начиная с PHP 5.3.0) по сути работает как строки в одинарных кавычках. Разница в том, что даже одиночные кавычки или обратные слэши не должны быть экранированы. Nowdoc идентифицируется с помощью той же<<<последовательности, что и для heredocs, но следующий идентификатор заключен в одинарные кавычки, например<<<'EOT'. В nowdoc анализ не выполняется.

Примечания: одиночные кавычки внутри одинарных кавычек и двойные кавычки внутри двойных кавычек должны быть экранированы:

$string = 'He said "What\'s up?"';
$string = "He said \"What's up?\"";

Скорость:
я бы не придавал слишком большого веса одинарным кавычкам, которые бывают быстрее двойных. Они, вероятно, быстрее в определенных ситуациях. Вот статья, объясняющая, каким образом одинарные и двойные кавычки, по сути, одинаково быстры, начиная с PHP 4.3 ( Useless Optimizationsвнизу, раздел C). Кроме того, на этой странице тестов есть сравнение с одинарной или двойной кавычкой. Большинство сравнений одинаковы. Есть одно сравнение, где двойные кавычки медленнее, чем одинарные.


17
+1 за фигурную скобку. Не знал об этом. Жаль , что не следует тем же правилам, что и сценарии оболочки, то есть ${variablename}.
devios1

6
Я использую только двойные кавычки, когда мне это нужно \n, все остальное в моем PHPкоде в одинарных кавычках.
Джо Смо

кажется 'heredoc' портирован на PHP из bash или нет? В любом случае отличный ответ, так что +1 Спасибо.
sjsam

2
Интересное примечание в комментариях к документации PHP: php.net/manual/en/language.types.string.php#120160 - « Строки в двойных кавычках», которые выглядят такими медленными, поскольку они должны анализировать все для обратной косой черты \ n и доллара признаки для раскрытия переменных », оказалось, что это самый быстрый метод конкатенации строк в PHP - PERIOD! Одиночные кавычки быстрее, только если ваша строка полностью литеральна (без разбора в ней и без объединения), но поле равно очень маленький и не имеет значения. "
17

1
Примечание: медлительность "двойных кавычек остается в прошлом. Обновления увеличили обработку двойных кавычек, чтобы быть такими же быстрыми во всех случаях, кроме крайних, в наши дни.
ШерилХоман

211

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

$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.

1
Экранированные одинарные кавычки и экранированные обратные слэши расширяются даже в одиночных кавычках.
Питер Айтай

43
Ошибка, с которой сталкиваются многие новички в PHP: $mailbody = 'I want a line break:\nDone.';поддерживать \nжизнь. Принимая во внимание: $mailbody = "I want a line break:\nDone.";будет разбирать разрыв строки.
Кай Ноак

Мои два цента нужны только для интервью или для разработки вредоносных программ. Просто сравните var_dump () из двух выражений: $testWithAsciiAndUtf8Characters = "\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!"; $simpleTest = '\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!'; Символьные последовательности в $testWithAsciiAndUtf8Charactersбыли преобразованы в строку с реальными буквами.
Ростислав Пилипенко

56

' Сингл цитируется

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

Пример:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;

" Двойные кавычки

Используйте двойные кавычки в PHP, чтобы избежать необходимости использовать точку для разделения кода (Примечание: используйте фигурные скобки {}для включения переменных, если вы не хотите использовать .оператор concatenation ( )) в строке.

Пример:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";

Есть ли в PHP прямая кавычка на производительность по сравнению с двойной?

Да. Это немного быстрее использовать одинарные кавычки.

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


Один исключение одинарные кавычки НЕ разбора ничего в строке, является то , что вы можете использовать , \'чтобы избежать одного апострофа для использования в строке (или \\'для отображения обратной косой черты). Обратите внимание, что традиционные escape-последовательности, такие как \n, НЕ будут анализироваться с символом перевода строки. PHP документы на строки
SherylHohman

Я вижу во всех ответах, что: вы можете использовать имя переменной внутри двойной кавычки, чтобы распечатать значение переменной, но вы говорите, что имя переменной также должно быть заключено в фигурные скобки, чтобы избежать необходимости использования конкатенации период. Так что, если и «$ my_var», и «{$ my_var}» выводят значение $ my_var, для чего нужны скобки? Спасибо!
Бахман.

40

Строка в одинарных кавычках не имеет интерпретируемых переменных. Строка в двойных кавычках делает.

Кроме того, строка в двойных кавычках может содержать апострофы без обратной косой черты, а строка в одинарных кавычках может содержать неэкранированные кавычки.

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


8
Строки в одинарных кавычках также используют меньше памяти. Самый быстрый способ обработки строк в PHP - использовать одинарные кавычки и использовать. оператор для объединения строк и переменных.
Рибальд Эдди

хм, поправьте меня, если я ошибаюсь, но базовый язык для PHP - C, верно? Тогда почему строковые кавычки отличаются в PHP и C?
грабить Ваминала

1
@rob waminal: PHP может быть реализован на C, но это другой язык. Язык PHP определяет эту семантику.
Бореалид

@Ribald - не будет ли синтаксис nowdoc быстрее? Строки с одинарными кавычками анализируются на наличие экранированных одинарных кавычек и обратной косой черты.
Питер Айтай

@ Питер, вы можете быть правы, я никогда не удосужился действительно покопаться в этом. В документации PHP заявлено о скорости, я решил поверить документам на веру. :)
RibaldEddie

27

В PHP оба 'my name'и "my name"являются строковыми. Вы можете прочитать больше об этом в руководстве по PHP .

То, что вы должны знать,

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

В PHP, люди используют одинарные кавычки , чтобы определить постоянную строку, как 'a', 'my name', 'abc xyz', при этом используя двойные кавычки , чтобы определить строку содержит идентификатор , как "a $b $c $d".

И другое дело,

echo 'my name';

быстрее чем

echo "my name";

но

echo 'my ' . $a;

медленнее, чем

echo "my $a";

Это верно для других используемых строк.


18

Пример одинарных, двойных, heredoc и nowdoc кавычек

<?php

    $fname = "David";

    // Single quotes
    echo 'My name is $fname.'; // My name is $fname.

    // Double quotes
    echo "My name is $fname."; // My name is David.

    // Curly braces to isolate the name of the variable
    echo "My name is {$fname}."; // My name is David.

    // Example of heredoc
    echo $foo = <<<abc
    My name is {$fname}
    abc;

        // Example of nowdoc
        echo <<< 'abc'
        My name is "$name".
        Now, I am printing some
    abc;

?>

16

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

$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test

Здесь двойная кавычка анализирует значение, а одинарная кавычка рассматривается как строковое значение (без разбора $testпеременной.)


12

Оба вида вложенных символов являются строками. Один тип цитаты удобно использовать для заключения другого типа цитаты. "'" и '"'. Самое большое различие между типами кавычек состоит в том, что ссылки на вложенные идентификаторы заменяются внутри двойных кавычек, а не внутри одинарных кавычек.


3

Разница между использованием одинарных кавычек и двойных кавычек в php заключается в том, что если мы используем одинарные кавычки в выражении echo, то он обрабатывается как строка. ... но если мы введем имя переменной в двойных кавычках, она выведет значение этой переменной вместе со строкой.



-1

Одна вещь:

Очень важно отметить, что строка с закрывающим идентификатором Heredoc не должна содержать других символов, кроме точки с запятой (;) . В частности, это означает, что идентификатор не может иметь отступ , и не должно быть пробелов или табуляции до или после точки с запятой.

Пример:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
Это верное утверждение, но оно не имеет ничего общего с вопросом здесь.
miken32

-1

Может быть, я немного опоздал, и немного не по теме, но здесь это все равно:

Вам не обязательно выбирать из-за содержимого вашей строки между:
alert("It's \"game\" time."); илиalert('It\'s "game" time.');

Если вы знакомы с использованием английских кавычек и правильного символа для апострофа, вы можете использовать либо двойные, либо одинарные кавычки, потому что это больше не будет иметь значения:
alert("It’s “game” time.");иalert('It’s “game” time.');

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.