Quelle est la différence entre les chaînes entre guillemets simples et entre guillemets doubles en PHP?

796

Je suis un peu confus pourquoi je vois du code en PHP avec une chaîne placée entre guillemets simples et parfois entre guillemets doubles.

Je sais juste en .NET, ou en langage C, si c'est dans une seule citation, cela signifie que c'est un caractère, pas une chaîne.

voler waminal
la source

Réponses:

1086

Les chaînes PHP peuvent être spécifiées non seulement de deux manières, mais de quatre manières.

  1. Les chaînes entre guillemets simples afficheront les choses presque complètement «telles quelles». Les variables et la plupart des séquences d'échappement ne seront pas interprétées. L'exception est que pour afficher un guillemet simple littéral\', vous pouvez l'échapper avec une barre oblique inverse, et pour afficher une barre oblique inverse, vous pouvez l'échapper avec une autre barre oblique inverse\\( donc oui, même les chaînes entre guillemets simples sont analysées ).
  2. Les chaînes de guillemets doubles afficheront une multitude de caractères d'échappement (y compris certaines expressions rationnelles), et les variables dans les chaînes seront évaluées. Un point important ici est que vous pouvez utiliser des accolades pour isoler le nom de la variable que vous souhaitez évaluer . Par exemple, disons que vous avez la variable$typeet que vous le souhaitezecho "The $types are". Cela recherchera la variable$types. Pour contourner cette utilisationecho "The {$type}s are"Vous pouvez placer l'accolade gauche avant ou après le signe dollar. Jetez un œil à l' analyse des chaînes pour voir comment utiliser les variables de tableau et autres.
  3. La syntaxe des chaînes Heredoc fonctionne comme des chaînes entre guillemets doubles. Ça commence par<<<. Après cet opérateur, un identifiant est fourni, puis une nouvelle ligne. La chaîne elle-même suit, puis à nouveau le même identifiant pour fermer la citation. Vous n'avez pas besoin d'échapper aux guillemets dans cette syntaxe.
  4. La syntaxe de chaîne Nowdoc (depuis PHP 5.3.0) fonctionne essentiellement comme des chaînes entre guillemets simples. La différence est que même les guillemets simples ou les barres obliques inverses ne doivent pas être échappés. Un nowdoc est identifié avec la même<<<séquence que celle utilisée pour les heredocs, mais l'identifiant qui suit est placé entre guillemets simples, par exemple<<<'EOT'. Aucune analyse n'est effectuée dans nowdoc.

Remarques: Les guillemets simples à l'intérieur des guillemets simples et les guillemets doubles à l'intérieur des guillemets doubles doivent être échappés:

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

Vitesse:
je ne mettrais pas trop de poids sur les guillemets simples étant plus rapides que les guillemets doubles. Ils sont probablement plus rapides dans certaines situations. Voici un article expliquant une manière dont les guillemets simples et doubles sont essentiellement aussi rapides depuis PHP 4.3 ( Useless Optimizationsvers le bas, section C). En outre, cette page de benchmarks propose une comparaison de devis simple vs double. La plupart des comparaisons sont les mêmes. Il existe une comparaison où les guillemets doubles sont plus lents que les guillemets simples.

Peter Ajtai
la source
17
+1 pour l'astuce de l'accolade frisée. N'était pas au courant de cela. Dommage qu'il ne suive pas les mêmes conventions que les scripts shell, ie ${variablename}.
devios1
6
J'utilise uniquement des guillemets doubles, lorsque j'en ai besoin \n, tout le reste de mon PHPcode est entre guillemets simples.
Jo Smo
semble que «heredoc» soit porté en PHP depuis bash ou n'est-ce pas? Quoi qu'il en soit une excellente réponse, donc un +1 Merci.
sjsam
2
Note intéressante dans les commentaires de la documentation PHP: php.net/manual/en/language.types.string.php#120160 - "Les chaînes entre guillemets" qui semblent si lentes car elles doivent tout analyser pour \ n les barres obliques inverses et $ dollar signes pour faire une expansion variable ", s'est avéré être la méthode de concaténation de chaîne la plus RAPIDE en PHP - PÉRIODE! Les guillemets simples ne sont plus rapides que si votre chaîne est complètement littérale (sans rien à analyser et rien à concaténer), mais la marge est très petit et n'a pas d'importance. "
dregad
1
Remarque: la lenteur des "guillemets doubles est tout sauf une chose du passé. Les mises à jour ont augmenté le traitement des guillemets doubles pour être aussi rapide, dans presque tous les cas extrêmes, de nos jours.
SherylHohman
211

Les choses sont évaluées entre guillemets doubles mais pas en guillemets simples:

$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
la source
1
Les guillemets simples et les antislashs échappés sont développés même dans les chaînes entre guillemets simples.
Peter Ajtai
43
Une erreur dans laquelle de nombreux développeurs nouveaux en PHP sont en train de courir: $mailbody = 'I want a line break:\nDone.';garder le \nvivant. Attendu que: $mailbody = "I want a line break:\nDone.";analysera le saut de ligne.
Kai Noack
Mes deux cents sont nécessaires uniquement pour les entretiens ou pour le développement de logiciels malveillants. Comparez simplement var_dump () à partir de deux expressions: les $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}!'; séquences de caractères dans $testWithAsciiAndUtf8Charactersont été transformées en chaîne avec de vraies lettres.
Rostyslav Pylypenko
56

' Devis simple

La façon la plus simple de spécifier une chaîne est de la placer entre guillemets simples. Les guillemets simples sont généralement plus rapides et tout ce qui est cité à l'intérieur est traité comme une chaîne simple.

Exemple:

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

" Devis double

Utilisez des guillemets doubles en PHP pour éviter d'avoir à utiliser le point pour séparer le code (Remarque: utilisez des accolades {}pour inclure des variables si vous ne souhaitez pas utiliser l' .opérateur concaténation ( )) dans la chaîne.

Exemple:

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

Y a-t-il un avantage de performance entre guillemets simples et guillemets doubles en PHP?

Oui. Il est légèrement plus rapide d'utiliser des guillemets simples.

PHP n'utilisera pas de traitement supplémentaire pour interpréter ce qui se trouve à l'intérieur du guillemet simple. lorsque vous utilisez des guillemets doubles, PHP doit analyser pour vérifier s'il y a des variables dans la chaîne.

Janak Kanani
la source
La seule exception aux guillemets simples n'analysant rien dans la chaîne est ce que vous pouvez utiliser \'pour échapper à une apostrophe unique à utiliser dans la chaîne (ou \\'pour afficher la barre oblique inverse). Notez que les séquences d'échappement traditionnelles, telles que celles \nqui ne seront PAS analysées avec le caractère de nouvelle ligne.
Documents
Je vois sur toutes les réponses que: vous pouvez utiliser le nom de la variable entre guillemets pour imprimer la valeur de la variable, mais vous dites que le nom de la variable doit également être placé entre accolades pour éviter d'avoir à utiliser une concaténation période. Donc, si "$ my_var" et "{$ my_var}" produisent la valeur de $ my_var, à quoi servent les accolades? Merci!
Bahman.A
40

Une chaîne entre guillemets simples ne contient pas de variables interprétées. Une chaîne entre guillemets le fait.

En outre, une chaîne entre guillemets doubles peut contenir des apostrophes sans barres obliques inverses, tandis qu'une chaîne entre guillemets simples peut contenir des guillemets non échappés.

Les chaînes entre guillemets simples sont plus rapides à l'exécution car elles n'ont pas besoin d'être analysées.

Borealid
la source
8
Les chaînes entre guillemets simples utilisent également moins de mémoire. Le moyen le plus rapide de gérer les chaînes en PHP est d'utiliser des guillemets simples et d'utiliser le. pour concaténer des chaînes et des variables.
RibaldEddie
hmmm, corrigez-moi si je me trompe, mais le langage de base pour PHP est C à droite? Alors pourquoi les guillemets diffèrent en PHP et C?
rob waminal
1
@rob waminal: PHP peut être implémenté en C, mais c'est un langage différent. Le langage PHP spécifie ces sémantiques.
Borealid
@Ribald - La syntaxe nowdoc ne serait-elle pas plus rapide? Les chaînes entre guillemets simples sont analysées pour les guillemets simples et les barres obliques inversées.
Peter Ajtai
@Peter, vous avez peut-être raison, je n'ai jamais pris la peine de m'y plonger vraiment. La documentation PHP fait la revendication de vitesse, j'ai décidé de croire les docs sur la foi. :)
RibaldEddie
27

En PHP, les deux 'my name'et "my name"sont des chaînes. Vous pouvez en savoir plus à ce sujet dans le manuel PHP .

Ce que vous devez savoir sont

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

En PHP, les gens utilisent pour définir guillemet simple une chaîne constante, comme 'a', 'my name', 'abc xyz', tout en utilisant des guillemets doubles pour définir une chaîne identifiant contiennent comme "a $b $c $d".

Et autre chose,

echo 'my name';

est plus rapide que

echo "my name";

mais

echo 'my ' . $a;

est plus lent que

echo "my $a";

Cela est vrai pour les autres chaînes utilisées.

Bang Dao
la source
18

Exemple de guillemets simple, double, heredoc et 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;

?>
Rabindra Nath
la source
16

En PHP, le texte de guillemet simple est considéré comme une valeur de chaîne et le texte de guillemet double analysera les variables en remplaçant et en traitant leur valeur.

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

Ici, les guillemets doubles analysent la valeur et les guillemets simples sont considérés comme des valeurs de chaîne (sans analyser la $testvariable.)

Maulik Bhojani
la source
12

Les deux types de caractères fermés sont des chaînes. Un type de devis est commodément utilisé pour joindre l'autre type de devis. "'" et '"'. La plus grande différence entre les types de guillemets réside dans le fait que les références d'identificateur incluses sont substituées aux guillemets doubles internes, mais pas dans les guillemets simples.

wallyk
la source
3

La différence entre l'utilisation de guillemets simples et de guillemets doubles en php est que si nous utilisons des guillemets simples dans l'instruction echo, cela est traité comme une chaîne. ... mais si nous saisissons le nom de la variable entre guillemets, la valeur de cette variable sera sortie avec la chaîne.

Hamza
la source
0

Voici quelques possibilités de guillemets simples et doubles avec variable

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';
vampire chez les adolescentes
la source
-1

Une chose:

Il est très important de noter que la ligne avec l'identifiant de fermeture de Heredoc ne doit contenir aucun autre caractère, sauf un point - virgule (;) . Cela signifie en particulier que l'identifiant peut ne pas être en retrait et qu'il ne peut y avoir aucun espace ou tabulation avant ou après le point-virgule.

Exemple:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
srmilon
la source
1
Ceci est une vraie déclaration, mais n'a rien à voir avec la question ici.
miken32
-1

Je suis peut-être un peu en retard, et un peu hors sujet, mais le voici quand même:

Vous n'avez pas nécessairement à choisir en raison du contenu de votre chaîne entre:
alert("It's \"game\" time.");oualert('It\'s "game" time.');

Si vous connaissez l'utilisation des guillemets anglais et le caractère correct pour l'apostrophe, vous pouvez utiliser des guillemets doubles ou simples, car cela n'aura plus d'importance:
alert("It’s “game” time.");etalert('It’s “game” time.');

Takit Isy
la source