Was ist der Unterschied zwischen Zeichenfolgen in einfachen und doppelten Anführungszeichen in PHP?

796

Ich bin ein wenig verwirrt, warum ich in PHP Code sehe, dessen Zeichenfolge in einfache Anführungszeichen und manchmal in doppelte Anführungszeichen gesetzt wird.

Ich weiß nur in .NET oder der C-Sprache, wenn es sich um ein einfaches Anführungszeichen handelt, bedeutet dies, dass es sich um ein Zeichen und nicht um eine Zeichenfolge handelt.

Rob Waminal
quelle

Antworten:

1086

PHP-Strings können nicht nur auf zwei , sondern auf vier Arten angegeben werden.

  1. Einfache Zeichenfolgen in Anführungszeichen zeigen die Dinge fast vollständig "wie sie sind" an. Variablen und die meisten Escape-Sequenzen werden nicht interpretiert. Die Ausnahme ist, dass Sie zum Anzeigen eines wörtlichen einfachen Anführungszeichens einen Schrägstrich\'und bei einem hinteren Schrägstrich einen weiteren umgekehrten Schrägstrich verwenden können\\( also werden auch Zeichenfolgen in einfachen Anführungszeichen analysiert ).
  2. Zeichenfolgen in doppelten Anführungszeichen zeigen eine Vielzahl von maskierten Zeichen (einschließlich einiger regulärer Ausdrücke) an, und Variablen in den Zeichenfolgen werden ausgewertet. Ein wichtiger Punkt hierbei ist, dass Sie geschweifte Klammern verwenden können, um den Namen der Variablen zu isolieren, die ausgewertet werden soll . Nehmen wir zum Beispiel an, Sie haben die Variable$typeund möchtenecho "The $types are". Das wird nach der Variablen suchen$types. Um dies zuecho "The {$type}s are"umgehen, können Sie die linke Klammer vor oder nach dem Dollarzeichen setzen. Schauen Sie sich das Parsen von Zeichenfolgen an, um zu sehen, wie Array-Variablen und dergleichen verwendet werden.
  3. Die Heredoc- Zeichenfolgensyntax funktioniert wie Zeichenfolgen in doppelten Anführungszeichen. Es beginnt mit<<<. Nach diesem Operator wird eine Kennung und anschließend eine neue Zeile angegeben. Die Zeichenfolge selbst folgt und dann dieselbe Kennung erneut, um das Zitat zu schließen. Sie müssen Anführungszeichen in dieser Syntax nicht umgehen.
  4. Die String-Syntax von Nowdoc (seit PHP 5.3.0) funktioniert im Wesentlichen wie Zeichenfolgen in einfachen Anführungszeichen. Der Unterschied besteht darin, dass nicht einmal einfache Anführungszeichen oder Backslashes maskiert werden müssen. Ein Nowdoc wird mit der gleichen<<<Reihenfolge identifiziert, die für Heredocs verwendet wird, aber die folgende Kennung ist in einfache Anführungszeichen eingeschlossen, z<<<'EOT'. In nowdoc wird keine Analyse durchgeführt.

Anmerkungen: Einfache Anführungszeichen in einfachen Anführungszeichen und doppelte Anführungszeichen in doppelten Anführungszeichen müssen maskiert werden:

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

Geschwindigkeit:
Ich würde nicht zu viel Gewicht darauf legen, dass einfache Anführungszeichen schneller sind als doppelte Anführungszeichen. In bestimmten Situationen sind sie wahrscheinlich schneller. In diesem Artikel wird eine Art und Weise erläutert, in der einfache und doppelte Anführungszeichen seit PHP 4.3 im Wesentlichen gleich schnell sind ( Useless Optimizationsunten, Abschnitt C). Außerdem enthält diese Benchmark-Seite einen Vergleich zwischen einfachen und doppelten Anführungszeichen. Die meisten Vergleiche sind gleich. Es gibt einen Vergleich, bei dem doppelte Anführungszeichen langsamer sind als einfache Anführungszeichen.

Peter Ajtai
quelle
17
+1 für den Curly Brace Trick. War mir dessen nicht bewusst. Schade, dass es nicht den gleichen Konventionen wie Shell-Skripte folgt, d ${variablename}. H.
Devios1
6
Ich verwende nur doppelte Anführungszeichen, wenn ich es brauche \n, alles andere in meinem PHPCode steht in einfachen Anführungszeichen.
Jo Smo
scheint 'heredoc' von bash nach PHP portiert zu sein oder nicht? Wie auch immer, tolle Antwort, also +1 Danke.
Sjsam
2
Interessanter Hinweis in den Kommentaren zur PHP-Dokumentation: php.net/manual/en/language.types.string.php#120160 - "Die Zeichenfolgen in doppelten Anführungszeichen", die so langsam aussehen, da sie alles für \ n Backslashes und $ Dollar analysieren müssen Zeichen für die variable Erweiterung ", stellte sich als die SCHNELLSTE Methode zur Verkettung von Zeichenfolgen in PHP heraus - PERIODE! Einfache Anführungszeichen sind nur dann schneller, wenn Ihre Zeichenfolge vollständig wörtlich ist (nichts zu analysieren und nichts zu verketten), aber der Rand ist sehr klein und spielt keine Rolle. "
Dregad
1
Hinweis: Die Langsamkeit von "doppelten Anführungszeichen gehört der Vergangenheit an. Aktualisierungen haben dazu geführt, dass die Verarbeitung von doppelten Anführungszeichen heutzutage so schnell wie in extremen Fällen ist.
SherylHohman
211

Die Dinge werden in doppelten Anführungszeichen, aber nicht in einfachen Anführungszeichen bewertet:

$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.
Dani
quelle
1
Escape-einfache Anführungszeichen und Escape-Backslashes werden auch in Zeichenfolgen in einfachen Anführungszeichen erweitert.
Peter Ajtai
43
Ein Fehler, mit dem viele PHP-neue Entwickler konfrontiert sind, $mailbody = 'I want a line break:\nDone.';besteht darin, das \nLeben am Leben zu erhalten. Während: $mailbody = "I want a line break:\nDone.";wird den Zeilenumbruch analysieren.
Kai Noack
Meine zwei Cent werden nur für Interviews oder für die Entwicklung von Malware benötigt. Vergleichen Sie einfach var_dump () aus zwei Ausdrücken: $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}!'; Zeichenfolgen in $testWithAsciiAndUtf8Characterswurden in Zeichenfolgen mit echten Buchstaben umgewandelt.
Rostyslav Pylypenko
56

' Einfach zitiert

Die einfachste Möglichkeit, eine Zeichenfolge anzugeben, besteht darin, sie in einfache Anführungszeichen zu setzen. Ein einfaches Anführungszeichen ist im Allgemeinen schneller und alles, was darin zitiert wird, wird als einfache Zeichenfolge behandelt.

Beispiel:

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

" Doppelt zitiert

Verwenden Sie in PHP doppelte Anführungszeichen, um zu vermeiden, dass der Punkt zum Trennen von Code verwendet werden muss (Hinweis: Verwenden Sie geschweifte Klammern {}, um Variablen einzuschließen , wenn Sie den .Operator concatenation ( ) nicht in Zeichenfolgen verwenden möchten ).

Beispiel:

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

Gibt es in PHP einen Leistungsvorteil für einfache Anführungszeichen gegenüber doppelten Anführungszeichen?

Ja. Es ist etwas schneller, einfache Anführungszeichen zu verwenden.

PHP verwendet keine zusätzliche Verarbeitung, um zu interpretieren, was im einfachen Anführungszeichen enthalten ist. Wenn Sie doppelte Anführungszeichen verwenden, muss PHP analysieren, um zu überprüfen, ob die Zeichenfolge Variablen enthält.

Janak Kanani
quelle
Die einzige Ausnahme für einfache Anführungszeichen, die nichts in der Zeichenfolge analysieren, besteht \'darin, ein einzelnes Apostroph für die Verwendung in der Zeichenfolge \\'zu maskieren (oder den Backslash anzuzeigen). Beachten Sie, dass herkömmliche Escape-Sequenzen, wie z. B. \nNICHT, auf das Zeilenumbruchzeichen analysiert werden. PHP-Dokumente zu Strings
SherylHohman
Bei allen Antworten sehe ich Folgendes: Sie können den Variablennamen in einem doppelten Anführungszeichen verwenden, um den Wert der Variablen auszudrucken, aber Sie sagen, der Variablenname sollte auch in geschweiften Klammern stehen, um die Verwendung einer Verkettung zu vermeiden Zeitraum. Wenn also sowohl "$ my_var" als auch "{$ my_var}" den Wert von $ my_var ausgeben, wofür stehen die Klammern? Vielen Dank!
Bahman.A
40

In einer Zeichenfolge in einfachen Anführungszeichen werden keine Variablen interpretiert. Eine Zeichenfolge in doppelten Anführungszeichen.

Eine Zeichenfolge in doppelten Anführungszeichen kann auch Apostrophe ohne umgekehrte Schrägstriche enthalten, während eine Zeichenfolge in einfachen Anführungszeichen nicht umschlossene Anführungszeichen enthalten kann.

Die Zeichenfolgen in einfachen Anführungszeichen sind zur Laufzeit schneller, da sie nicht analysiert werden müssen.

Borealid
quelle
8
Zeichenfolgen in einfachen Anführungszeichen benötigen außerdem weniger Speicher. Der schnellste Weg, um mit Strings in PHP umzugehen, ist in einfachen Anführungszeichen und unter Verwendung von. Operator zum Verketten von Zeichenfolgen und Variablen.
RibaldEddie
hmmm, korrigiere mich wenn ich falsch liege aber die Basissprache für PHP ist C richtig? Warum unterscheiden sich dann Anführungszeichen in PHP und C?
Rob Waminal
1
@rob waminal: PHP kann in C implementiert werden, es ist jedoch eine andere Sprache. Die PHP-Sprache gibt diese Semantik an.
Borealid
@ Ribald - Wäre die Nowdoc-Syntax nicht schneller? Zeichenfolgen in einfachen Anführungszeichen werden für maskierte einfache Anführungszeichen und Backslashes analysiert.
Peter Ajtai
@Peter, Sie haben vielleicht Recht, ich habe mich nie wirklich darum gekümmert. Die PHP-Dokumentation macht den Geschwindigkeitsanspruch geltend, ich habe mich entschlossen, den Dokumenten auf Glauben zu glauben. :)
RibaldEddie
27

In PHP sind beide 'my name'und "my name"Zeichenfolgen. Weitere Informationen finden Sie im PHP-Handbuch .

Was Sie wissen sollten, sind

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

In PHP, Apostroph Menschen verwenden einen konstanten String zu definieren, wie 'a', 'my name', 'abc xyz', während doppelte Anführungszeichen mit einer Zeichenfolge zu definieren , enthalten Bezeichner wie "a $b $c $d".

Und eine andere Sache ist,

echo 'my name';

ist schneller als

echo "my name";

aber

echo 'my ' . $a;

ist langsamer als

echo "my $a";

Dies gilt auch für andere verwendete Zeichenfolgen.

Bang Dao
quelle
18

Beispiel für einfache, doppelte, heredoc- und nowdoc-Anführungszeichen

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

?>
Rabindra Nath
quelle
16

In PHP wird Text in einfachen Anführungszeichen als Zeichenfolgenwert betrachtet, und Text in doppelten Anführungszeichen analysiert die Variablen, indem sie ihren Wert ersetzen und verarbeiten.

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

Hier wird der Wert durch doppelte Anführungszeichen analysiert, und einfache Anführungszeichen werden als Zeichenfolgenwert betrachtet (ohne die $testVariable zu analysieren .)

Maulik Bhojani
quelle
12

Beide Arten von eingeschlossenen Zeichen sind Zeichenfolgen. Eine Art von Zitat wird zweckmäßigerweise verwendet, um die andere Art von Zitat einzuschließen. "'" und '"'. Der größte Unterschied zwischen den Anführungszeichen besteht darin, dass eingeschlossene Bezeichnerreferenzen für doppelte Anführungszeichen, jedoch nicht für einfache Anführungszeichen eingesetzt werden.

Wallyk
quelle
3

Der Unterschied zwischen der Verwendung von einfachen Anführungszeichen und doppelten Anführungszeichen in PHP besteht darin, dass wenn wir einfache Anführungszeichen in der Echo-Anweisung verwenden, diese als Zeichenfolge behandelt werden. ... aber wenn wir den Variablennamen in doppelte Anführungszeichen eingeben, wird der Wert dieser Variablen zusammen mit der Zeichenfolge ausgegeben.

Hamza
quelle
0

Hier einige Möglichkeiten von einfachen und doppelten Anführungszeichen mit Variablen

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';
Teenager-Vampir
quelle
-1

Eine Sache:

Es ist sehr wichtig zu beachten, dass die Zeile mit der abschließenden Kennung von Heredoc keine anderen Zeichen als ein Semikolon (;) enthalten darf . Dies bedeutet insbesondere, dass der Bezeichner möglicherweise nicht eingerückt ist und vor oder nach dem Semikolon keine Leerzeichen oder Tabulatoren vorhanden sein dürfen .

Beispiel:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
srmilon
quelle
1
Dies ist eine wahre Aussage, hat aber nichts mit der Frage hier zu tun.
Miken32
-1

Vielleicht bin ich ein bisschen spät dran und ein bisschen abseits des Themas, aber hier ist es trotzdem:

Sie müssen aufgrund des Inhalts Ihrer Zeichenfolge nicht unbedingt wählen zwischen:
alert("It's \"game\" time.");oderalert('It\'s "game" time.');

Wenn Sie mit der Verwendung der englischen Anführungszeichen und dem richtigen Zeichen für das Apostroph vertraut sind, können Sie entweder doppelte oder einfache Anführungszeichen verwenden, da dies keine Rolle mehr spielt:
alert("It’s “game” time.");undalert('It’s “game” time.');

Takit Isy
quelle