Sigueme en Twitter
«Anterior | Siguiente»

Mitos de PHP: ¿Comillas simples o dobles?

4/02/2009

La diferencia entre comillas simples y dobles en PHP es que las dobles interpretan caracteres especiales que se encuentran dentro de la cadena. El uso de variables dentro de la cadena es el ejemplo mas común.

1
2
3
4
5
6
7
8
$one = "miercoles";
$two = "jueves";
 
/* Despliega: Hoy es $one y mañana $two */
echo 'Hoy es $one y mañana $two';
 
/* Despliega: Hoy es miercoles y mañana jueves */
echo "Hoy es $one y mañana $two";

Hace tiempo cuando cuando PHP 4 era la novedad, el uso de comillas simples se prefería sobre el uso de comillas dobles si su uso era intensivo, ya que el trabajo extra del interprete con las comillas dobles lo hacia significativamente mas lento.

Con PHP 5 esa diferencia en rendimiento ya no existe.

O bien existe, pero la diferencia es demasiado pequeña para ser realmente apreciable. Es un error recomendar el evitar comillas dobles argumentando que tienen pobre rendimiento. Haces mejor evitando micro-optimizar en pro de escribir un código mas legible. Una mejora de mili-segundos sobre miles de iteraciones no te significará una mejora apreciable.

1
2
3
4
5
/* Las comillas dobles hacen mas legibles las concatenaciones */
$test = " $one $two {$three}{$four} $five ";
 
/* Las comillas simples.. no tanto */
$test = ' ' . $one . ' ' . $two . ' ' . $three . $four . ' ' . $five . ' ';

Si realmente te importan ese par de mili-segundos, deberías de preguntarte si PHP es el lenguaje que debes de utilizar.


Hay 14 comentarios:

  1. 4/02/2009Gunnar Wolf dice:

    Uno de los principales problemas de PHP son sus programadores. ¿Cuántas veces has visto mounstrosidades como:

    $mysql_query("SELECT * FROM usuarios WHERE login = '$usrlogin'");

    …esto es lo que hace tan vulnerables a tantísimas aplicaciones escritas en PHP. Y hace que PHP sea un lenguaje tan mal documentado, con una cultura que enfatiza tanto en “sácalo rápido sin preguntarte cómo funciona”, tan inseguro.
    Para el ejemplo en cuestión – Sí, concatenar variables creando una concatenación de muchas cadenitas no sólo es más feo y menos claro sino que mucho más lento que usar comillas dobles – ¿Por qué? Porque no estás declarando una cadena, sino que cinco (casualmente, todas igualitas: ‘ ‘), y llevando a cabo nueve concatenaciones.
    Considera usar cadenas de formato:

    $concatenada = sprintf(' %s %s %s%s %s ', $uno, $dos, $tres, $cuatro, $cinco);

    Esto no te salva de tener que sanitizar tus variables, ya sea para uso en BD, en HTML o en lo que gustes. Pero te las pone mucho más limpias.
    Desconozco suficiente PHP para mostrarte cómo deberías hacer esto, pero supongamos que existe un ‘map’ similar al de Perl, y quieres envolver a las cinco en html_encode():

    $concatenada = sprintf(' %s %s %s%s %s ', map {html_encode($_)} ($uno, $dos, $tres, $cuatro, $cinco));
  2. 4/02/2009Jesús dice:

    estuve leyendo algo igual sobre print y echo…

    como sea, en esto de las comillas, me resulta más fácil usar comillas simples cuando voy a imprimir html, porque generalmente en html se usan comillas dobles y no me gusta andar escapando con \ las comillas dobles de html…

  3. 4/02/2009Stan dice:

    @Pablasso interesante lectura man, siempre quise saber la diferencia :D

  4. 4/02/2009pecesama dice:

    Muy interesante reflexión Pablo, me quedo con el último párrafo para analizarlo después.

  5. 4/02/2009pablasso dice:

    @Gunnar: Gracias por la respuesta, completamente de acuerdo contigo acerca del uso de las comillas simples. Para concatenar son lentas y difíciles de leer. También completamente de acuerdo en el tener que sanitizar todo dato que venga del usuario, que aunque es un tema que se sale de lo que hablamos, es regla básica.

    Pero difiero en el uso de sprintf, por lo menos en lo personal me parece mas claro el uso de las comillas dobles (cuestión de gustos supongo) y es bastante mas lento.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    <?php
     
    $uno = $dos = $tres = $cuatro = $cinco = '';
     
    $t = microtime(true);
    $i = 0;
    while ( $i < 100000 )
    {
        $concatenada = ' ' . $uno . ' ' . $dos . ' ' . $tres . $cuatro . ' ' . $cinco . ' ';
        $i++;
    }
    var_dump(microtime(true) - $t);
    /* float(0.147819042206) */
     
    $t = microtime(true);
    $i = 0;
    while ( $i < 100000 )
    {
        $concatenada = sprintf(' %s %s %s%s %s ', $uno, $dos, $tres, $cuatro, $cinco);
        $i++;
    }
    var_dump(microtime(true) - $t);
    /* float(0.213158130646) */
     
    $t = microtime(true);
    $i = 0;
    while ( $i < 100000 )
    {
        $concatenada = " $uno $dos {$tres}{$cuatro} $cinco ";
        $i++;
    }
    var_dump(microtime(true) - $t);
    /* float(0.0608670711517) */
    ?>

    Nuevamente, dejar de utilizarlo por esa diferencia de velocidad sobre un ciclo tan grande, en una aplicación web me parece micro-optimizar en exceso. Lo usaría sobre comillas simples en pro de legibilidad, pero no sobre dobles.

  6. 4/02/2009pablasso dice:

    @Jesús: Y haces bien en usar lo que mas te acomode, sobre todo si no tienes que concatenar texto, en una cadena simple da absolutamente igual.

    @Stan, @pecesama: Gracias!

  7. 4/02/2009Zicco dice:

    No estaba enterado de la mejora en PHP 5 respecto a las comillas dobles. Creo que esto ya queda en cuestión de gustos o “característica” del propio programador. Yo estoy como dijo Jesús, no me gusta estar escapando las comillas dobles y es más cómodo para mí presionar la comilla simple en el teclado.

    Saludos. Buen Post.

  8. 12/02/2009Victor De la Rocha dice:

    órale! Desde el punto de vista de legibilidad me ha convencido. Muy muy buen tema para post.

    OT: me recordó aquellos años cuando tenía la duda de porque diablos poner un exit() o die() despues de un header con redirección o_O

  9. 8/03/2009Hugo Gomez dice:

    Umm, con comillas dobles es mas legible?, bueno ya sera cuestion de gustos, pero en mi opinion es mas legible separar las variables fuera de las comillas, se me hace mas sencillo buscar en un string donde el texto esta separado por colores (el texto es de un color y la variable de otro), que un string de un solo color.

    Ademas esta comprobado que el ojo humano no lee, solo escanea el contenido de una manera rapida tratando de encontrar lo que busca.

  10. 8/03/2009pablasso dice:

    El que el string que contiene variables sea de un solo color depende de tu editor Hugo.

    Yo por lo menos Vim, Komodo y Textmate no tengo problema, distinguen variables dentro de strings, caso contrario de este blog, que pone todo de un solo color :-P

  11. 21/04/2009Carlos Eliseo Torres dice:

    Escribo poemas en un foro,Ahi se me critica ó sugiere el uso de comillas dobles
    diciendome que las comillas dobles,significan aquello que no es mio,pero según sé
    lo que está dentro de las comillas es interpretado,como he leído aqui,mi pregunta es,
    si encierro un poema entre comillas dobles,es por que ese poema lleva un algo especial
    para mi significa,que quierro que el lector sepa,que el tal poema es bien pensado,según yo
    independientemente de si el poema gusta oh no al lector,que opinan de mi locura,estoy bien oh no.
    Carlos,

  12. 23/10/2009luz dice:

    Carlos, creo que no tomaste en cuenta la secuencia del tema ya que se refiere al uso de las comillas en programación netamente y no en escritura de texto como tal.

  13. 16/11/2009elmorrover2 dice:

    Gracias por el articulo.

  14. 11/12/2009Pablo dice:

    Amigos, les hago una consulta,
    Estoy realizando un programa en PHP5 que transacciona contra una base de datos Postgres que es a su vez alimentada desde otro aplicatvo.
    La estructura de datos del otro aplicativo define tanto a las tablas como a los campos en mayúscula.
    Luego para que PG responda por ejemplo a un Select, la sintaxis me obliga a utilizar comillas, como ser…

    select “CARP” from “PROC”

    No permite el uso de comillas simples ni sin comillas. El problema se me da cuando requiero colocar tal sentencia dentro de una variable para realizar el query, ya que al tener comillas dobles utilizadas, no encuentro manera de resolverlo.
    Desde ya muchas gracias
    Saludos

Escribe tu comentario:

¿Escribiste código? [+]

Para hacerlo más legible puedes utilizar la etiqueta <pre>.
Ejemplo: <pre lang="php" line="1"> código </pre>
  • El atributo lang indica el lenguaje de programación.
  • El atributo line indica desde donde comienza la numeración.


  Los mas frikis pueden suscribirse a los comentarios por RSS.