Qual è la differenza tra stringhe a virgoletta singola e doppie tra virgolette in PHP?


796

Sono un po 'confuso perché vedo del codice in PHP con stringa inserita tra virgolette singole e talvolta tra virgolette doppie.

So solo in .NET, o nel linguaggio C, se è racchiuso tra virgolette singole, significa che è un carattere, non una stringa.

Risposte:


1086

Le stringhe PHP possono essere specificate non solo in due modi, ma in quattro modi.

  1. Le stringhe a virgoletta singola visualizzeranno le cose quasi completamente "così come sono". Le variabili e la maggior parte delle sequenze di escape non verranno interpretate. L'eccezione è che per visualizzare una virgoletta singola letterale, puoi evitarlo con una barra\'rovesciata e per visualizzare una barra rovesciata, puoi scappare con un'altra barra rovesciata\\( quindi sì, anche le stringhe tra virgolette singole vengono analizzate ).
  2. Le stringhe con virgolette doppie visualizzeranno una serie di caratteri di escape (inclusi alcuni regex) e verranno valutate le variabili nelle stringhe. Un punto importante qui è che puoi usare le parentesi graffe per isolare il nome della variabile che vuoi valutare . Ad esempio, supponiamo che tu abbia la variabile$typee che desideriecho "The $types are". Quello cercherà la variabile$types. Per aggirare questo usoecho "The {$type}s are"È possibile mettere la parentesi graffa sinistra prima o dopo il simbolo del dollaro. Dai un'occhiata all'analisi delle stringhe per vedere come usare le variabili di array e simili.
  3. La sintassi della stringa Heredoc funziona come stringhe tra virgolette doppie. Comincia con<<<. Dopo questo operatore, viene fornito un identificatore, quindi una nuova riga. Segue la stringa stessa e quindi di nuovo lo stesso identificativo per chiudere l'offerta. Non è necessario sfuggire alle virgolette in questa sintassi.
  4. La sintassi della stringa Nowdoc (da PHP 5.3.0) funziona essenzialmente come stringhe tra virgolette singole. La differenza è che non è necessario sfuggire nemmeno alle virgolette singole o alle barre rovesciate. Un nowdoc viene identificato con la stessa<<<sequenza utilizzata per gli heredocs, ma l'identificatore che segue è racchiuso tra virgolette singole, ad es<<<'EOT'. Nessun analisi viene eseguita in nowdoc.

Note: le virgolette singole all'interno delle virgolette singole e quelle doppie all'interno delle virgolette doppie devono essere salvate:

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

Velocità:
non darei troppo peso alle virgolette singole essendo più veloce delle virgolette doppie. Probabilmente sono più veloci in determinate situazioni. Ecco un articolo che spiega un modo in cui le virgolette singole e doppie sono sostanzialmente ugualmente veloci dal PHP 4.3 ( Useless Optimizationsverso il basso, sezione C). Inoltre, questa pagina di benchmark ha un confronto tra virgolette singole e doppie. La maggior parte dei confronti sono gli stessi. C'è un confronto in cui le virgolette doppie sono più lente delle virgolette singole.


17
+1 per il trucco delle parentesi graffe. Non ne ero a conoscenza. Peccato che non segua le stesse convenzioni degli script di shell, vale a dire ${variablename}.
devios1

6
Uso solo virgolette doppie, quando ne ho bisogno \n, qualsiasi altra cosa nel mio PHPcodice è racchiusa tra virgolette singole.
Jo Smo,

sembra che l'ereditarietà sia trasferito su PHP da bash o no? Comunque ottima risposta, quindi un +1 Grazie.
sjsam,

2
Nota interessante nei commenti sulla documentazione di PHP: php.net/manual/en/language.types.string.php#120160 - "Le stringhe tra virgolette doppie" che sembrano così $ lente poiché devono analizzare tutto per \ n barre rovesciate e $ dollaro segni per fare l'espansione variabile ", si è rivelato essere il metodo di concatenazione di stringhe PIÙ VELOCE in PHP - PERIODO! Le virgolette singole sono più veloci solo se la stringa è completamente letterale (con nulla da analizzare e nulla da concatenare), ma il margine è molto piccolo e non importa. "
Dregad,

1
Nota: la lentezza delle "doppie virgolette è tutt'altro che un ricordo del passato. Gli aggiornamenti hanno aumentato l'elaborazione delle doppie virgolette per essere più veloci, in tutti i casi, tranne in casi estremi, al giorno d'oggi.
SherylHohman,

211

Le cose vengono valutate tra virgolette doppie ma non in singole:

$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
Virgolette singole con escape e barre rovesciate con escape vengono espanse anche in stringhe con virgolette singole.
Peter Ajtai,

43
Un errore in cui sono in esecuzione molti sviluppatori nuovi di PHP: $mailbody = 'I want a line break:\nDone.';mantenere \nvivo. Considerando che: $mailbody = "I want a line break:\nDone.";analizzerà l'interruzione di linea.
Kai Noack,

I miei due centesimi sono necessari solo per interviste o per lo sviluppo di malware. Basta confrontare var_dump () da due espressioni: le $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}!'; sequenze di caratteri in $testWithAsciiAndUtf8Characterssono state trasformate in stringhe con lettere reali.
Rostyslav Pylypenko,

56

' Citato singolo

Il modo più semplice per specificare una stringa è racchiuderlo tra virgolette singole. La virgoletta singola è generalmente più veloce e tutto ciò che viene citato all'interno viene trattato come una semplice stringa.

Esempio:

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

" Doppio citato

Usa le virgolette doppie in PHP per evitare di usare il punto per separare il codice (Nota: usa le parentesi graffe {}per includere le variabili se non vuoi usare l' .operatore concatenazione ( )) nella stringa.

Esempio:

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

In PHP esiste un vantaggio in termini di prestazioni rispetto alla virgoletta doppia?

Sì. È leggermente più veloce usare le virgolette singole.

PHP non utilizzerà l'elaborazione aggiuntiva per interpretare ciò che è all'interno della singola citazione. quando usi le virgolette doppie PHP deve analizzare per verificare se ci sono variabili all'interno della stringa.


L' unica eccezione alle virgolette singole NON analizza nulla all'interno della stringa, è ciò che è possibile utilizzare \'per evitare un singolo apostrofo da utilizzare all'interno della stringa (o \\'per visualizzare la barra rovesciata). Si noti che le sequenze di escape tradizionali, ad esempio \nNON verranno analizzate nel carattere di nuova riga. Documenti PHP sulle stringhe
SherylHohman,

Vedo su tutte le risposte che: puoi usare il nome della variabile all'interno di una doppia virgoletta per stampare il valore della variabile, ma stai dicendo, il nome della variabile dovrebbe essere racchiuso tra parentesi graffe per evitare la necessità di usare un concatenamento periodo. Quindi se sia "$ my_var" che "{$ my_var}" producono il valore di $ my_var, a cosa servono le parentesi graffe? Grazie!
Bahman

40

Una stringa a virgoletta singola non contiene variabili interpretate al suo interno. Lo fa una stringa tra virgolette doppie.

Inoltre, una stringa tra virgolette doppie può contenere apostrofi senza barre rovesciate, mentre una stringa con virgolette singole può contenere virgolette senza caratteri di escape.

Le stringhe a virgoletta singola sono più veloci in fase di esecuzione perché non devono essere analizzate.


8
Le stringhe tra virgolette singole usano anche meno memoria. Il modo più veloce per gestire le stringhe in PHP è con virgolette singole e usando il. operatore per concatenare stringhe e variabili.
RibaldEddie,

hmmm, correggimi se sbaglio ma la lingua di base per PHP è C giusto? Allora perché le virgolette di stringa differiscono in PHP e C?
Rob Waminal,

1
@rob waminal: PHP può essere implementato in C, ma è un linguaggio diverso. Il linguaggio PHP specifica queste semantiche.
Borealid,

@Ribald - La sintassi di nowdoc non sarebbe più veloce? Le stringhe con virgolette singole vengono analizzate per virgolette singole e barre rovesciate con escape.
Peter Ajtai,

@Peter, potresti essere corretto, non mi sono mai preso la briga di scavare davvero. La documentazione di PHP afferma la velocità, ho deciso di credere ai documenti sulla fede. :)
RibaldEddie

27

In PHP, entrambi 'my name'e "my name"sono stringhe. Puoi leggere di più al riguardo nel manuale di PHP .

Cosa dovresti sapere lo sono

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

In PHP, le persone utilizzano virgoletta per definire una stringa costante, come 'a', 'my name', 'abc xyz', durante l'utilizzo di virgolette per definire una stringa contiene identificatore come "a $b $c $d".

E l'altra cosa è

echo 'my name';

è più veloce di

echo "my name";

ma

echo 'my ' . $a;

è più lento di

echo "my $a";

Questo è vero per altri usi della stringa.


18

Esempio di virgolette singole, doppie, ereditarie e 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

In PHP, il testo con virgolette singole viene considerato come valore stringa e il testo con virgolette doppie analizza le variabili sostituendone ed elaborandone il valore.

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

Qui, la virgoletta doppia analizza il valore e la virgoletta singola viene considerata come valore stringa (senza analizzare la $testvariabile).


12

Entrambi i tipi di caratteri racchiusi sono stringhe. Un tipo di preventivo è convenientemente usato per racchiudere l'altro tipo di preventivo. "'" e '"'. La più grande differenza tra i tipi di virgolette è che i riferimenti agli identificatori racchiusi sono sostituiti da virgolette doppie, ma non da virgolette singole.


3

La differenza tra l'uso di virgolette singole e virgolette doppie in php è che se usiamo virgolette singole nell'istruzione echo, allora viene trattata come una stringa. ... ma se inseriamo il nome della variabile tra virgolette doppie, verrà emesso il valore di quella variabile insieme alla stringa.


0

Ecco alcune possibilità di virgolette singole e doppie con variabile

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

Una cosa:

È molto importante notare che la riga con l'identificatore di chiusura di Heredoc non deve contenere altri caratteri, tranne un punto e virgola (;) . Ciò significa in particolare che l'identificatore non può essere rientrato e non possono esserci spazi o tabulazioni prima o dopo il punto e virgola.

Esempio:

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

1
Questa è una vera affermazione, ma non ha nulla a che fare con la domanda qui.
miken32,

-1

Forse sono un po 'in ritardo e un po' fuori tema, ma eccolo qui:

Non devi necessariamente scegliere a causa del contenuto della tua stringa tra:
alert("It's \"game\" time.");oalert('It\'s "game" time.');

Se hai familiarità con l'uso delle virgolette inglesi e il carattere corretto per l'apostrofo, puoi usare virgolette doppie o singole, perché non avrà più importanza:
alert("It’s “game” time.");ealert('It’s “game” time.');

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.