Яка різниця між одноцитованими та двоцитованими рядками в PHP?


796

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

Я просто знаю в .NET або мові C, якщо вона є в одній цитаті, це означає, що це символ, а не рядок.

Відповіді:


1086

Рядки PHP можна задавати не просто двома способами, а чотирма способами.

  1. Поодинокі рядки, що цитуються , відобразять речі майже повністю "як є". Змінні та більшість послідовностей виходу не інтерпретуються. Виняток полягає в тому, що для відображення буквальної одиничної цитати ви можете уникнути її з косою косою рисою\', а для відображення зворотної косою рисою можна уникнути її з іншою косою косою рисою\\( Так, так, навіть окремі рядки, що цитуються, розбираються ).
  2. Двомісні рядки цитат відображатимуть безліч втечених символів (включаючи деякі регулярні вирази), а змінні в рядках будуть оцінені. Тут важливим моментом є те, що ви можете використовувати фігурні дужки, щоб виділити ім'я змінної, яку ви хочете оцінити . Наприклад, скажімо, у вас є змінна$typeі ви хочетеecho "The $types are". Це буде шукати змінну$types. Щоб обійти це використанняecho "The {$type}s are"Ви можете поставити ліву дужку до або після знака долара. Погляньте на розбір рядків, щоб побачити, як використовувати змінні масиву тощо.
  3. Синтаксис рядка Heredoc працює як рядки з подвійним цитуванням. Це починається з<<<. Після цього оператора надається ідентифікатор, потім новий рядок. Слідує сам рядок, а потім той самий ідентифікатор знову, щоб закрити пропозицію. Вам не потрібно уникати лапок у цьому синтаксисі.
  4. Синтаксис рядків синтаксису Nowdoc (з PHP 5.3.0) по суті працює як одиночні цитовані рядки. Різниця полягає в тому, що не потрібно уникати навіть одиничних котирувань чи зворотних косих ринків. Nowdoc ототожнюється з тією ж<<<послідовністю, що використовується для гередоків, але наступний ідентифікатор вкладається в одинарні лапки, наприклад<<<'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 - ПЕРІОД! Одиночні котирування швидше лише у тому випадку, якщо ваша рядок є повністю буквальною (без її розбору і нічим не з'єднується), але маржа - дуже крихітний і не має значення ".
Дреґад

1
Примітка: повільність "подвійних лапок - це все, але не минуле. Оновлення збільшили обробку подвійних лапок, щоб вони були настільки ж швидкими у всіх, крім крайніх випадків, в ці дні.
SherylHohman

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, щоб уникнути необхідності використання періоду для розділення коду (Примітка. Використовуйте фігурні дужки {}для включення змінних, якщо ви не хочете використовувати .оператор конкатенації ( )).

Приклад:

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

Чи є одна вигода від продуктивності та подвійна ціна в PHP?

Так. Трохи швидше використовувати одинарні лапки.

PHP не використовуватиме додаткову обробку для інтерпретації того, що знаходиться в одній цитаті. при використанні подвійних лапок PHP повинен проаналізувати, щоб перевірити, чи є в рядку якісь змінні.


Один виняток одинарні лапки НЕ розбору нічого в рядку, є те , що ви можете використовувати , \'щоб уникнути одного апострофа для використання в рядку (або \\'для відображення зворотної косої межі). Зауважте, що традиційні послідовності евакуації, такі як \nНЕ буде розбиратися на символ нового рядка. Документи PHP на струнах
SherylHohman

Я бачу в усіх відповідях: ви можете використовувати ім'я змінної всередині подвійної лапки, щоб роздрукувати значення змінної, але ви говорите, ім'я змінної також повинно бути вкладено в фігурні дужки, щоб уникнути необхідності використання конкатенації періоду. Тож якщо і "$ my_var", і "{$ my_var}" виводять значення $ my_var, для чого слід дужки? Дякую!
Бахман.А

40

Рядок з одним котируванням не має інтерпретованих змінних. Рядок з подвійним цитуванням робить.

Також рядок з подвійним котируванням може містити апострофи без зворотних косих рядків, тоді як рядок з одним котируванням може містити незмінені лапки.

Рядки з одним цитуванням швидші під час виконання, оскільки їх не потрібно розбирати.


8
Одно цитувані рядки також використовують менше пам'яті. Найшвидший спосіб обробляти рядки в PHP - це одинарні лапки та використання. оператор для об'єднання рядків і змінних.
RibaldEddie

хммм, виправте мене, якщо я помиляюся, але базовою мовою для PHP є C правильно? Тоді чому рядкові лапки відрізняються між PHP та C?
пограбувати waminal

1
@rob waminal: PHP може бути реалізований на C, але це інша мова. Мова PHP визначає ці семантики.
Borealid

@Ribald - Не став би синтаксис теперdoc швидшим? Одиночні рядки, що цитуються, розбираються для уникнутих одиночних лапок та зворотних косих ринків.
Пітер Айтай

@ Петер, ти можеш мати рацію, я ніколи не намагався по-справжньому копатися до цього. Документація на 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

Приклад одинарних, подвійних, гередокських та теперішніх цитат

<?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.