Jaka jest różnica między pojedynczo cytowanymi i Podwójnie cytowanymi łańcuchami w PHP?

Nie jestem ekspertem w programowaniu PHP, ale jestem trochę zdezorientowany, dlaczego widzę jakiś kod w PHP z ciągiem umieszczonym w pojedynczych cudzysłowach, a czasami w podwójnych cudzysłowach.

Po prostu wiem w. NET, lub w języku C, jeśli jest w jednym cudzysłowu, to znaczy, że jest to znak, a nie ciąg znaków.

Author: Peter Mortensen, 2010-08-10

11 answers

Stringi PHP może być określony nie tylko na dwa sposoby, ale na cztery sposoby.

  1. pojedyncze cytowane ciągi wyświetli rzeczy prawie całkowicie " tak jak jest."Zmienne i większość sekwencji escape nie będą interpretowane. Wyjątkiem jest to, że aby wyświetlić dosłowny pojedynczy cudzysłów, możesz uciec od niego za pomocą ukośnika \', a aby wyświetlić ukośnik, możesz uciec od niego za pomocą innego ukośnika \\ (więc tak, nawet singiel cytowane ciągi są przetwarzane).
  2. podwójne ciągi cytatów wyświetli szereg znaków unikalnych (w tym niektóre wyrażenia regularne), A zmienne w łańcuchach zostaną ocenione. Ważnym punktem jest tutaj to, że możesz użyć nawiasów klamrowych, aby wyizolować nazwę zmiennej, którą chcesz ocenić. Na przykład powiedzmy, że masz zmienną $type i co echo "The $types are", które będą szukać zmiennej $types. Aby obejść to użycie echo "The {$type}s are" możesz umieścić lewy klamra przed lub po znaku dolara. Spójrz na string parsing , aby zobaczyć, jak używać zmiennych tablicowych i takich.
  3. Heredoc składnia string działa jak podwójne cytowane ciągi. Zaczyna się od <<<. Po tym operatorze podany jest identyfikator, a następnie znak nowej linii. Następuje sam ciąg znaków, a następnie ponownie ten sam identyfikator, aby zamknąć notację. Nie musisz unikać cudzysłowów w tej składni.
  4. Nowdoc (od PHP 5.3.0) składnia ciągów działa zasadniczo jak pojedyncze cytowane ciągi. Różnica polega na tym, że nawet pojedyncze cudzysłowy lub ukośniki nie muszą być unikane. Nowdoc jest identyfikowany z tą samą sekwencją <<< używaną dla heredocs, ale poniższy identyfikator jest zamknięty w pojedynczych cudzysłowach, np. <<<'EOT'. żadne parsowanie nie jest wykonywane w nowdoc.

Prędkość:
Nie przywiązywałbym zbyt dużej wagi do tego, że pojedyncze cytaty są szybsze niż podwójne. Prawdopodobnie są szybsze w pewnych sytuacje. Oto artykuł wyjaśniający jeden sposób, w jaki pojedyncze i podwójne cytaty są zasadniczo równie szybkie od PHP 4.3 (Useless Optimizations w kierunku dołu, sekcja C). Ponadto, to strona benchmarks posiada porównanie pojedynczego kontra podwójnego cytatu. Większość porównań jest taka sama. Jest jedno porównanie, w którym podwójne cudzysłowy są wolniejsze niż pojedyncze.

 947
Author: Peter Ajtai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-11 12:23:00

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

$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.
 178
Author: Dani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 05:19:34

Pojedynczy cytat

Najprostszym sposobem na określenie ciągu znaków jest umieszczenie go w cudzysłowach. Pojedynczy cytat jest na ogół szybszy, a wszystko cytowane wewnątrz traktowane jako zwykły ciąg znaków.

Przykład:

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

Double quoted

Użyj podwójnych cudzysłowów w PHP, aby uniknąć konieczności używania kropki do oddzielania kodu (Uwaga: użyj nawiasów klamrowych {} do dołączania zmiennych, jeśli nie chcesz używać operatora concatenation (.)) w łańcuchu znaków.

Przykład:

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

Jest czy istnieje korzyść z wydajności pojedynczy cytat vs podwójny cytat w PHP?

Tak. Nieco szybciej jest używać pojedynczych cudzysłowów.

PHP nie używa dodatkowego przetwarzania do interpretacji tego, co znajduje się wewnątrz pojedynczego cytatu. gdy używasz podwójnych cudzysłowów, PHP musi parsować, aby sprawdzić, czy nie ma tam żadnych zmiennych.

 37
Author: Janak Kanani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-11 12:26:28

Pojedynczy cytowany łańcuch nie zawiera zmiennych w sobie interpretowanych. Podwójny cytowany ciąg tak.

Również podwójny cytowany łańcuch może zawierać apostrofy bez odwrotnych ukośników, podczas gdy pojedynczy cytowany łańcuch może zawierać nieoznaczone cudzysłowy.

Pojedynczo cytowane łańcuchy są szybsze w czasie wykonywania, ponieważ nie muszą być przetwarzane.

 34
Author: Borealid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 05:15:17

W PHP zarówno 'my name', jak i "my name" są łańcuchami znaków. Więcej na ten temat możesz przeczytać w instrukcji PHP .

Thing you should know are

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

W PHP ludzie używają pojedynczego cudzysłowu do definiowania stałego ciągu znaków, jak 'a', 'my name', 'abc xyz', podczas używania podwójnego cudzysłowu do definiowania ciągu znaków zawiera identyfikator "a $b $c $d".

I jeszcze jedno,

echo 'my name';

Jest szybszy niż

echo "my name";

Ale

echo 'my ' . $a;

Jest wolniejszy niż

echo "my $a";

To prawda dla inne używane ciągi.

 23
Author: Bang Dao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-11 12:24:45

Przykład cytatów pojedynczych, podwójnych, heredoc i 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;

?>
 15
Author: Rabindra Nath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-11 14:36:44

Oba rodzaje zamkniętych znaków są ciągami znaków. Jeden rodzaj cytatu jest wygodnie używany do załączenia drugiego rodzaju cytatu. "'" i '"'. Największą różnicą między typami cudzysłowów jest to, że zamknięte odniesienia identyfikacyjne są zastępowane wewnątrz podwójnych cudzysłowów, ale nie wewnątrz pojedynczych cudzysłowów.

 11
Author: wallyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 05:15:35

W PHP tekst z pojedynczym cudzysłowem jest traktowany jako wartość łańcuchowa, a tekst z podwójnym cudzysłowem 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, double quote parsuje wartość, a single quote jest traktowany jako wartość łańcuchowa (bez parsowania zmiennej $ test.)

 11
Author: Maulik Bhojani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-04 20:58:43

Może jestem trochę spóźniony, i trochę off-topic, ale tutaj i tak jest...

Nie musisz wybierać ze względu na zawartość łańcucha pomiędzy:
alert("It's \"game\" time."); LUB alert('It\'s "game" time.');

Zamiast tego możesz pisać w ten sposób, a następnie używać podwójnych lub pojedynczych cudzysłowów, ponieważ nie będzie to miało znaczenia:
alert("It’s “game” time."); i alert('It’s “game” time.');

 0
Author: Takit Isy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 13:09:29
$name = 'test';
$singleQuote = 'This is example for single quote $name'; // here $name variable not evaluating 
echo $singleQuote; // Output: This is example for single quote $name
$singleQuote = "This is example for single quote $name"; // here $name variable will evaluate and replace variable value
echo $singleQuote; // Output: This is example for single quote test

Also inside single quote expression evaluate faster campare to double quotes
 0
Author: Mahadeva Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 13:18:40

Jedno:

Bardzo ważne jest, aby pamiętać, że wiersz z identyfikatorem zamykającym Heredoc nie może zawierać żadnych innych znaków, z wyjątkiem średnika (;) . Oznacza to w szczególności, że identyfikator nie może być wcięty i nie może być żadnych spacji Ani tabulatorów przed lub po średniku.

Przykład:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
 -1
Author: srmilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-03 06:28:00