¿Cuál es la diferencia entre cadenas de comillas simples y comillas dobles en PHP?

796

Estoy un poco confundido por qué veo algún código en PHP con cadenas entre comillas simples y, a veces, entre comillas dobles.

Solo sé en .NET, o el lenguaje C, si está entre comillas simples, eso significa que es un carácter, no una cadena.

robar waminal
fuente

Respuestas:

1086

Las cadenas PHP pueden especificarse no solo de dos maneras, sino de cuatro maneras.

  1. Las cadenas entre comillas simples mostrarán las cosas casi por completo "tal cual". Las variables y la mayoría de las secuencias de escape no serán interpretadas. La excepción es que para mostrar una comilla simple literal, puede escapar con una barra\'diagonal inversa, y para mostrar una barra diagonal inversa, puede escapar con otra barra diagonal inversa\\( así que sí, incluso las cadenas entre comillas simples se analizan ).
  2. Las cadenas de comillas dobles mostrarán una gran cantidad de caracteres escapados (incluidas algunas expresiones regulares) y se evaluarán las variables en las cadenas. Un punto importante aquí es que puede usar llaves para aislar el nombre de la variable que desea evaluar . Por ejemplo, supongamos que tiene la variable$typey deseaecho "The $types are". Eso buscará la variable$types. Para evitar este usoecho "The {$type}s are", puede colocar la llave izquierda antes o después del signo de dólar. Eche un vistazo al análisis de cadenas para ver cómo usar variables de matriz y demás.
  3. La sintaxis de cadena Heredoc funciona como cadenas dobles entre comillas. Se inicia con<<<. Después de este operador, se proporciona un identificador, luego una nueva línea. La cadena en sí sigue, y luego el mismo identificador nuevamente para cerrar la cita. No necesita escapar de las comillas en esta sintaxis.
  4. La sintaxis de cadena Nowdoc (desde PHP 5.3.0) funciona esencialmente como cadenas de comillas simples. La diferencia es que ni siquiera se deben escapar las comillas simples o las barras invertidas. Un nowdoc se identifica con la misma<<<secuencia utilizada para heredocs, pero el identificador que sigue está encerrado entre comillas simples, por ejemplo<<<'EOT'. No se realiza el análisis en nowdoc.

Notas: Las comillas simples dentro de comillas simples y las comillas dobles dentro de comillas dobles se deben escapar:

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

Velocidad:
no pondría demasiado peso en que las comillas simples fueran más rápidas que las dobles. Probablemente son más rápidos en ciertas situaciones. Aquí hay un artículo que explica una manera en que las comillas simples y dobles son esencialmente igual de rápidas desde PHP 4.3 ( Useless Optimizationshacia abajo, sección C). Además, esta página de referencia tiene una comparación entre comillas simples y dobles. La mayoría de las comparaciones son iguales. Hay una comparación donde las comillas dobles son más lentas que las comillas simples.

Peter Ajtai
fuente
17
+1 para el truco de llaves. No estaba al tanto de eso. Lástima que no siga las mismas convenciones que los scripts de shell, es decir ${variablename}.
devios1
66
Solo uso comillas dobles, cuando lo necesito \n, cualquier otra cosa en mi PHPcódigo está entre comillas simples.
Jo Smo
parece que 'heredoc' está portado a PHP desde bash o no? De todos modos, gran respuesta, así que un +1 Gracias.
sjsam
2
Nota interesante en los comentarios de la documentación de PHP: php.net/manual/en/language.types.string.php#120160 - "Las cadenas entre comillas dobles", que parecen muy lentas, ya que tienen que analizar todo por \ n barras invertidas y $ dólar signos para hacer una expansión variable ", ¡resultó ser el método de concatenación de cadenas MÁS RÁPIDO en PHP - PERIODO! Las comillas simples son solo más rápidas si su cadena es completamente literal (sin nada que analizar y nada que concatenar), pero el margen es muy pequeño y no importa ".
Dregad
1
Nota: la lentitud de "las comillas dobles es cosa del pasado. Las actualizaciones han aumentado el procesamiento de comillas dobles para que sea tan rápido, en todos los casos menos extremos, en estos días.
SherylHohman el
211

Las cosas se evalúan entre comillas dobles pero no entre comillas 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
fuente
1
Las comillas simples escapadas y las barras invertidas escapadas se expanden incluso en cadenas de comillas simples.
Peter Ajtai
43
Un error en el que se están ejecutando muchos desarrolladores nuevos en PHP: $mailbody = 'I want a line break:\nDone.';mantener \nvivo. Mientras que: $mailbody = "I want a line break:\nDone.";analizará el salto de línea.
Kai Noack
Mis dos centavos son necesarios solo para entrevistas o para el desarrollo de malware. Simplemente compare var_dump () de dos expresiones: las $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}!'; secuencias de caracteres $testWithAsciiAndUtf8Charactersse transformaron en cadenas con letras reales.
Rostyslav Pylypenko
56

' Solo citado

La forma más sencilla de especificar una cadena es encerrarla entre comillas simples. La comilla simple es generalmente más rápida, y todo lo que se cita dentro se trata como una cadena simple.

Ejemplo:

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

" Doble citado

Use comillas dobles en PHP para evitar tener que usar el punto para separar el código (Nota: use llaves {}para incluir variables si no desea usar el .operador de concatenación ( )) en la cadena.

Ejemplo:

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

¿Existe un beneficio de rendimiento entre comillas simples y comillas dobles en PHP?

Si. Es un poco más rápido usar comillas simples.

PHP no usará procesamiento adicional para interpretar lo que está dentro de la comilla simple. cuando usa comillas dobles, PHP tiene que analizar para verificar si hay alguna variable dentro de la cadena.

Janak Kanani
fuente
La única excepción a las comillas simples que NO analiza nada dentro de la cadena, es lo que puede usar \'para escapar de un apóstrofe único para usar dentro de la cadena (o \\'para mostrar la barra invertida). Tenga en cuenta que las secuencias de escape tradicionales, como \nNO se analizarán al carácter de nueva línea.
Documentos
Veo en todas las respuestas que: puede usar el nombre de la variable dentro de una comilla doble para imprimir el valor de la variable, pero está diciendo que el nombre de la variable también debe estar encerrado entre llaves para evitar la necesidad de usar una concatenación período. Entonces, si tanto "$ my_var" como "{$ my_var}" generan el valor de $ my_var, ¿para qué sirven las llaves? ¡Gracias!
Bahman. A
40

Una cadena entre comillas simples no tiene variables interpretadas. Una cadena con comillas dobles sí.

Además, una cadena entre comillas dobles puede contener apóstrofes sin barras invertidas, mientras que una cadena entre comillas simples puede contener comillas sin escapes.

Las cadenas entre comillas simples son más rápidas en tiempo de ejecución porque no es necesario analizarlas.

Borealid
fuente
8
Las cadenas entre comillas simples también usan menos memoria. La forma más rápida de manejar cadenas en PHP es con comillas simples y usando. operador para concatenar cadenas y variables.
RibaldEddie
hmmm, corrígeme si me equivoco pero el lenguaje base para PHP es C ¿verdad? Entonces, ¿por qué las comillas difieren en PHP y C?
Rob Waminal
1
@rob waminal: PHP puede implementarse en C, pero es un lenguaje diferente. El lenguaje PHP especifica estas semánticas.
Borealid
@Ribald - ¿No sería ahora la sintaxis doc más rápida? Las cadenas entre comillas simples se analizan para comillas simples y barras inclinadas invertidas.
Peter Ajtai
@ Peter, puede que tengas razón, nunca me he molestado en profundizar en ello. La documentación de PHP hace el reclamo de velocidad, decidí creer los documentos de fe. :)
RibaldEddie
27

En PHP, ambos 'my name'y "my name"son una cadena. Puede leer más sobre esto en el manual de PHP .

Lo que debes saber son

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

En PHP, la gente usa comilla simple de definir una cadena constante, como 'a', 'my name', 'abc xyz', durante el uso de comillas dobles para definir una cadena contener identificador como "a $b $c $d".

Y otra cosa es,

echo 'my name';

es más rápido que

echo "my name";

pero

echo 'my ' . $a;

es más lento que

echo "my $a";

Esto es cierto para otros utilizados de cadena.

Bang Dao
fuente
18

Ejemplo de citas simples, dobles, heredoc y 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
fuente
16

En PHP, el texto de comillas simples se considera como valor de cadena y el texto de comillas dobles analizará las variables reemplazando y procesando su valor.

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

Aquí, la comilla doble analiza el valor y la comilla simple se considera como valor de cadena (sin analizar la $testvariable).

Maulik Bhojani
fuente
12

Ambos tipos de caracteres encerrados son cadenas. Un tipo de cotización se usa convenientemente para incluir el otro tipo de cotización. "'" y '"'. La mayor diferencia entre los tipos de comillas es que las referencias de identificador incluidas se sustituyen por comillas dobles, pero no entre comillas simples.

wallyk
fuente
3

La diferencia entre usar comillas simples y comillas dobles en php es que si usamos comillas simples en la declaración echo, entonces se trata como una cadena. ... pero si ingresamos el nombre de la variable entre comillas dobles, generará el valor de esa variable junto con la cadena.

Hamza
fuente
0

Aquí algunas posibilidades de comillas simples y dobles con variable

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';
vampiro adolescente
fuente
-1

Una cosa:

Es muy importante tener en cuenta que la línea con el identificador de cierre de Heredoc no debe contener otros caracteres, excepto un punto y coma (;) . Eso significa especialmente que el identificador puede no estar sangrado , y puede que no haya espacios o pestañas antes o después del punto y coma.

Ejemplo:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
srmilon
fuente
1
Esta es una declaración verdadera, pero no tiene nada que ver con la pregunta aquí.
miken32
-1

Tal vez llego un poco tarde y un poco fuera de tema, pero aquí está de todos modos:

No necesariamente tiene que elegir debido al contenido de su cadena entre:
alert("It's \"game\" time.");oalert('It\'s "game" time.');

Si está familiarizado con el uso de las comillas en inglés y el carácter correcto para el apóstrofe, puede usar comillas dobles o simples, porque ya no importará:
alert("It’s “game” time.");yalert('It’s “game” time.');

Takit Isy
fuente