Jaka jest różnica między ciągami pojedynczymi i podwójnymi w PHP?


796

Jestem trochę zdezorientowany, dlaczego widzę jakiś kod w PHP z ciągiem znaków umieszczonym w pojedynczych cudzysłowach, a czasem w podwójnych cudzysłowach.

Znam tylko .NET lub język C, jeśli jest w jednym cudzysłowie, oznacza to, że jest to znak, a nie ciąg.

Odpowiedzi:


1086

Ciągi PHP można określić nie tylko na dwa sposoby, ale na cztery sposoby.

  1. Ciągi z pojedynczymi cudzysłowami będą wyświetlać rzeczy prawie całkowicie „takie, jakie są”. Zmienne i większość sekwencji specjalnych nie będą interpretowane. Wyjątkiem jest to, że aby wyświetlić dosłowny pojedynczy cudzysłów, możesz uciec z ukośnikiem\'odwrotnym, a aby wyświetlić ukośnik odwrotny, możesz uciec z innym ukośnikiem odwrotnym\\( więc tak, nawet ciągi pojedynczego cudzysłowu są analizowane ).
  2. Ciągi z podwójnym cudzysłowem wyświetlą wiele znaków ucieczki (w tym niektóre wyrażenia regularne), a zmienne w ciągach zostaną ocenione. Ważną kwestią jest to, że możesz użyć nawiasów klamrowych, aby wyizolować nazwę zmiennej, którą chcesz ocenić . Powiedzmy na przykład, że masz zmienną$typei chceszecho "The $types are". To będzie szukać zmiennej$types. Aby obejść ten problem,echo "The {$type}s are"możesz umieścić lewą klamrę przed lub po znaku dolara. Spójrz na parsowanie ciągów, aby zobaczyć, jak używać zmiennych tablicowych i tym podobnych.
  3. Składnia Heredoc działa jak ciągi podwójnie cytowane. Zaczyna się od<<<. Po tym operatorze podawany jest identyfikator, a następnie nowy wiersz. Następuje ciąg znaków, a następnie ten sam identyfikator, aby zamknąć ofertę. W tej składni nie trzeba wstawiać cudzysłowów.
  4. Składnia napisów Nowdoc (od PHP 5.3.0) działa zasadniczo jak ciągi pojedynczego cudzysłowu. Różnica polega na tym, że nawet pojedyncze cytaty i ukośniki odwrotne nie muszą być unikane. Nowdoc jest identyfikowany za pomocą tej samej<<<sekwencji, co heredoki, ale następujący identyfikator jest ujęty w pojedyncze cudzysłowy, np<<<'EOT'. W nowdoc nie jest przetwarzane.

Uwagi: Pojedyncze cudzysłowy wewnątrz pojedynczych cudzysłowów i podwójne cudzysłowy wewnątrz podwójnych cudzysłowów muszą być poprzedzone znakami ucieczki:

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

Szybkość:
Nie przykładałbym zbytniej wagi do tego, aby pojedyncze cytaty były szybsze niż podwójne. Prawdopodobnie są szybsze w niektórych sytuacjach. Oto artykuł wyjaśniający jeden ze sposobów, w jaki pojedyncze i podwójne cudzysłowy są zasadniczo równie szybkie od PHP 4.3 ( Useless Optimizationsw dół, sekcja C). Również ta strona testów porównawczych pojedynczych i podwójnych cytatów. Większość porównań jest taka sama. Istnieje jedno porównanie, w którym podwójne cudzysłowy są wolniejsze niż pojedyncze cudzysłowy.


17
+1 za sztuczkę z nawiasami klamrowymi. Nie byłam tego świadoma. Szkoda, że ​​nie przestrzega tych samych konwencji co skrypty powłoki, tj ${variablename}.
devios1

6
Używam tylko podwójnych cudzysłowów, kiedy tego potrzebuję \n, wszystko inne w moim PHPkodzie jest w pojedynczych cudzysłowach.
Jo Smo

wydaje się, że 'heredoc' jest przeniesiony do PHP z bash, czy nie? W każdym razie świetna odpowiedź, więc dziękuję +1.
sjsam

2
Ciekawa uwaga w komentarzach do dokumentacji PHP: php.net/manual/en/language.types.string.php#120160 - „Ciągi cudzysłowów”, które wyglądają tak wolno, ponieważ muszą parsować wszystko dla \ n odwrotnych ukośników i dolara znaki do zrobienia rozszerzania zmiennych ”, okazało się być najszybszą metodą konkatenacji ciągów w PHP - OKRES! Pojedyncze cudzysłowy są szybsze tylko wtedy, gdy ciąg jest całkowicie dosłowny (nie ma w nim żadnego parsowania ani konkatenacji), ale margines wynosi bardzo małe i nie ma znaczenia ”.
dregad

1
Uwaga: powolność "podwójnych cudzysłowów należy już do przeszłości. Aktualizacje zwiększyły przetwarzanie podwójnych ofert tak szybko, jak obecnie, we wszystkich przypadkach poza ekstremalnymi.
SherylHohman

211

Rzeczy są oceniane w podwójnych cudzysłowach, ale nie w jednym:

$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
Unikane pojedyncze cudzysłowy i uciekające ukośniki odwrotne są rozwijane nawet w ciągach pojedynczych cudzysłowów.
Peter Ajtai,

43
Błąd, w który napotyka wielu nowych programistów PHP: $mailbody = 'I want a line break:\nDone.';utrzymuje \nżycie. Podczas gdy: $mailbody = "I want a line break:\nDone.";parsuje podział linii.
Kai Noack,

Moje dwa centy są potrzebne tylko na wywiady lub rozwój złośliwego oprogramowania. Wystarczy porównać var_dump () z dwóch wyrażeń: $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}!'; Sekwencje znaków w $testWithAsciiAndUtf8Characterszostały przekształcone na ciąg z prawdziwymi literami.
Rostyslav Pylypenko

56

' Jedno cytat

Najprostszym sposobem na określenie ciągu jest umieszczenie go w pojedynczym cudzysłowie. Pojedynczy cytat jest generalnie szybszy, a wszystko w nim traktowane jako zwykły ciąg.

Przykład:

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

" Podwójnie cytowany

Używaj podwójnych cudzysłowów w PHP, aby uniknąć konieczności używania kropki do oddzielania kodu (Uwaga: Użyj nawiasów klamrowych, {}aby dołączyć zmienne, jeśli nie chcesz używać .operatora konkatenacji ( )) w ciągu.

Przykład:

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

Czy w PHP występuje korzyść w postaci pojedynczego cytatu w porównaniu z podwójnym cytatem?

Tak. Używanie pojedynczych cudzysłowów jest nieco szybsze.

PHP nie użyje dodatkowego przetwarzania do interpretacji tego, co znajduje się w pojedynczym cudzysłowie. kiedy używasz podwójnych cudzysłowów, PHP musi przeanalizować, czy w łańcuchu nie ma żadnych zmiennych.


Jeden wyjątek pojedyncze cytaty NIE analizowania czegokolwiek w ciągu, co można wykorzystać \'do ucieczki pojedynczy apostrof do użytku wewnątrz łańcucha (lub \\'do wyświetlenia backslash). Zauważ, że tradycyjne sekwencje specjalne, takie jak \nNIE zostaną przeanalizowane do znaku nowej linii.
Dokumenty

Widzę na wszystkich odpowiedziach, że: możesz użyć nazwy zmiennej wewnątrz podwójnego cudzysłowu, aby wydrukować wartość zmiennej, ale mówisz, nazwa zmiennej powinna również być zamknięta w nawiasach klamrowych, aby uniknąć konieczności użycia konkatenacji Kropka. Więc jeśli zarówno „$ my_var”, jak i {{$ my_var} generują wartość $ my_var, po co są nawiasy klamrowe? Dzięki!
Bahman.

40

Łańcuch pojedynczego cudzysłowu nie ma interpretowanych zmiennych. Tak działa łańcuch podwójny.

Również ciąg cudzysłowu może zawierać apostrofy bez odwrotnych ukośników, podczas gdy ciąg cudzysłowu może zawierać nieoznaczone cudzysłowy.

Ciągi pojedynczych cudzysłowów są szybsze w czasie wykonywania, ponieważ nie trzeba ich analizować.


8
Ciągi z pojedynczymi cudzysłowami również zużywają mniej pamięci. Najszybszym sposobem obsługi ciągów w PHP jest użycie pojedynczych cudzysłowów i użycie. operator do łączenia łańcuchów i zmiennych.
RibaldEddie,

hmmm, popraw mnie jeśli się mylę, ale podstawowym językiem PHP jest C, prawda? Dlaczego więc cytaty łańcuchowe różnią się w PHP i C?
rob waminal

1
@rob waminal: PHP może być zaimplementowane w C, ale jest to inny język. Język PHP określa te semantyki.
Borealid,

@Ribald - Czy składnia nowdoc nie byłaby szybsza? Ciągi pojedynczego cudzysłowu są analizowane pod kątem pojedynczych cudzysłowów i odwrotnych ukośników.
Peter Ajtai,

@Peter, możesz mieć rację, nigdy nie zadałem sobie trudu, żeby się w to zagłębić. Dokumentacja PHP mówi o szybkości, postanowiłem wierzyć dokumentom wiary. :)
RibaldEddie,

27

W PHP, jak 'my name'i "my name"są ciągiem. Możesz przeczytać więcej na ten temat w instrukcji PHP .

Rzeczy, które powinieneś wiedzieć są

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

W PHP, ludzie używają apostrof zdefiniować ciąg stały, jak 'a', 'my name', 'abc xyz', podczas gdy za pomocą podwójny cudzysłów zdefiniować ciąg zawierać identyfikator podobny "a $b $c $d".

A inną rzeczą jest

echo 'my name';

jest szybszy niż

echo "my name";

ale

echo 'my ' . $a;

jest wolniejszy niż

echo "my $a";

Dotyczy to innych używanych ciągów.


18

Przykład pojedynczych, podwójnych, heredoc i nowdoc cytatów

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

W PHP tekst pojedynczego cudzysłowu jest traktowany jako wartość ciągu, a tekst podwójnego cudzysłowu analizuje zmienne, zastępując i przetwarzając ich wartość.

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

Tutaj podwójny cytat parsuje wartość, a pojedynczy cudzysłów jest traktowany jako wartość ciągu (bez parsowania $testzmiennej).


12

Oba rodzaje zamkniętych znaków są ciągami. Jeden rodzaj cytatu jest dogodnie wykorzystywany w celu dołączenia drugiego rodzaju cytatu. "'" a '"'. Największą różnicą między typami cytatów jest to, że zawarte odwołania do identyfikatorów zastępują wewnętrzne cudzysłowy, ale nie wewnątrz pojedynczych cudzysłowów.


3

Różnica między używaniem pojedynczych cudzysłowów i podwójnych cudzysłowów w php polega na tym, że jeśli użyjemy pojedynczych cudzysłowów w instrukcji echo, to jest to traktowane jako ciąg znaków. ... ale jeśli wprowadzimy nazwę zmiennej w podwójnym cudzysłowie, wyświetli ona wartość tej zmiennej wraz z łańcuchem.


0

Oto niektóre możliwości pojedynczych i podwójnych cudzysłowów ze zmienną

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

Jedna sprawa:

Bardzo ważne jest, aby pamiętać, że wiersz z zamykającym identyfikatorem Heredoc nie może zawierać żadnych innych znaków oprócz średnika (;) . Oznacza to w szczególności, że identyfikator nie może być wcięty , a przed lub po średniku nie mogą być spacje ani tabulatory .

Przykład:

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

1
To jest prawdziwe stwierdzenie, ale nie ma tu nic wspólnego z pytaniem tutaj.
miken32

-1

Może jestem trochę spóźniony i trochę nie na temat, ale i tak jest:

Nie musisz wybierać z powodu zawartości łańcucha między:
alert("It's \"game\" time."); lubalert('It\'s "game" time.');

Jeśli znasz użycie angielskich znaków cudzysłowu i prawidłowego znaku dla apostrofu, możesz użyć podwójnego lub pojedynczego cudzysłowu, ponieważ nie będzie to już miało znaczenia:
alert("It’s “game” time.");ialert('It’s “game” time.');

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.