PHP: concatena o inserta directamente variables en una cadena


224

Me pregunto, ¿cuál es la forma correcta de insertar variables PHP en una cadena?

De esta manera:

echo "Welcome ".$name."!"

O de esta manera:

echo "Welcome $name!"

Ambos métodos funcionan en mi PHP v5.3.5. Este último es más corto y simple, pero no estoy seguro de si el primero es mejor formateado o si se acepta como más apropiado.


18
si estaba haciendo lo primero, personalmente prefiero una comilla simpleecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁


2
@ kjy112 Dije lo mismo en mi respuesta, soy un ENORME fanático de las comillas simples: X
Khez

11
Personalmente, ignoro la totalidad de "las comillas simples son más eficientes" y simplemente elijo "usar el estilo de comillas que requiera la última cantidad de escape interno". Es muy poco probable que cualquier código que escriba se beneficie de cualquier ganancia MICROSCÓPICA debido a un menor análisis de cadenas frente a una mayor concatenación de cadenas.
Marc B

1
El reclamo por pérdida de rendimiento es falso. Vea este artículo como referencia: nikic.github.io/2012/01/09/…
Damian

Respuestas:


344

Entre esas dos sintaxis, deberías elegir la que prefieras :-)

Personalmente, iría con su segunda solución en tal caso (interpolación variable) , que me resulta más fácil de escribir y leer.

El resultado será el mismo; e incluso si hay implicaciones de rendimiento, eso no importará 1 .


Como nota al margen, mi respuesta es un poco más completa: el día que querrás hacer algo como esto:

echo "Welcome $names!";

PHP interpretará su código como si estuviera tratando de usar la $namesvariable, que no existe. - tenga en cuenta que solo funcionará si usa "" not '' para su cadena.

Ese día, necesitarás usar {}:

echo "Welcome {$name}s!"

No es necesario recurrir a las concatenaciones.


También tenga en cuenta que su primera sintaxis:

echo "Welcome ".$name."!";

Probablemente podría optimizarse , evitando concatenaciones, utilizando:

echo "Welcome ", $name, "!";

(Pero, como dije antes, esto no importa mucho ...)


1 - A menos que esté haciendo cientos de miles de concatenaciones vs interpolaciones, y probablemente no sea el caso.


3
¡Excelente gracias! Es muy bueno saber que puedo usar mi método favorito para insertarlo directamente en la cadena, y estoy muy agradecido por saber cómo separar la variable del resto de la picadura si es necesario {}.
Web_Designer

64
Solo una nota de que separar los literales de cadena y las variables con comas solo funciona echo, no en ningún otro lugar.
colincameron

3
Solo señalando el rendimiento: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Concatenación) en realidad pierde alrededor de 300 milisegundos (para 200,000 artículos, eso es 1 milisegundo por cada mil elementos en su conjunto ...). Eso es ruido estadístico, es imposible incluso medir alguna diferencia. Teniendo en cuenta que es más legible, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Interpolación) es el ganador indiscutible ...
Fernando Cordeiro

1
Si quiere usar interpolación, debe usar comillas dobles.
Máxima Alekz

¿Es posible usar funciones dentro de una cadena? como echo "Esto es {foo ()} agradable"; ?
strix25

17

Las cadenas entre comillas dobles son más elegantes porque no tiene que dividir su cadena cada vez que necesita insertar una variable (como debe hacer con cadenas entre comillas simples).

Sin embargo, si necesita insertar el valor de retorno de una función, esto no se puede insertar en una cadena entre comillas dobles, ¡incluso si la rodea con llaves!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

10
Puede insertar funciones semi-indirectamente en cadenas a través de funciones variables de PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", que funciona alrededor de la "restricción".
Marc B

55
@Marc Eso es genial, ¡no lo sabía! También puede asignar el nombre de una función existente a una variable y hacer lo mismo:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael

3
eso es genial pero extremadamente ilegible, por lo que hay que evitarlo de todos modos.
Su sentido común el

2
$s = 'Hello ' . trim($world) .'!';Intente usar comillas simples cuando no haya nada que interpolar en una cadena. Mejorará el rendimiento y puede usarse como una convención para identificar a ambos
Sarath Sadasivan Pillai

9

Desde php4 puedes usar un formateador de cadena:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

Fuente: sprintf ()


Con mucho, la opción más segura. +1 por buenas prácticas y convenciones generales que coinciden con otros idiomas
Javier Arias

6

Cualquiera está bien. Use el que tenga mejor visibilidad para usted. Y hablando de visibilidad, también puede consultar printf .


5

Desde el punto de vista de hacer pensar de manera simple , legible , consistente y fácil de entender (ya que el rendimiento no importa aquí):

  • El uso de variables incrustadas entre comillas dobles puede conducir a situaciones complejas y confusas en las que desea incrustar propiedades de objetos, matrices multidimensionales, etc. Es decir, generalmente al leer variables incrustadas, no puede estar instantáneamente 100% seguro del comportamiento final de lo que está leyendo .

  • Con frecuencia necesita agregar muletas como {}y \, lo que IMO agrega confusión y hace que la legibilidad de la concatenación sea casi equivalente, si no mejor.

  • Tan pronto como necesite ajustar una llamada de función alrededor de la var, por ejemplo htmlspecialchars($var), debe cambiar a la concatenación.

  • AFAIK, no puedes incorporar constantes.

En algunos casos específicos, las "comillas dobles con incrustación de vars" pueden ser útiles, pero en términos generales, optaría por la concatenación (usando comillas simples o dobles cuando sea conveniente)


5

Sé que esta pregunta ya tiene una respuesta elegida, pero encontré este artículo que evidentemente muestra que la interpolación de cadenas funciona más rápido que la concatenación. Puede ser útil para aquellos que aún tienen dudas.


3

¡Ve con el primero y usa comillas simples!

  1. Es más fácil de leer, lo que significa que otros programadores sabrán lo que está sucediendo.
  2. Funciona un poco más rápido, la forma en que se crean los códigos de operación cuando PHP disecciona tu código fuente, básicamente lo hará de todos modos, ¡así que dale una mano!
  3. Si también usa comillas simples en lugar de comillas dobles, aumentará aún más su rendimiento.

Las únicas situaciones en las que debe utilizar comillas dobles, es cuando se necesita \r, \n, \t! La sobrecarga simplemente no vale la pena usarla en ningún otro caso.

También debe consultar la concatenación de variables PHP , phpbench.com para obtener algunos puntos de referencia sobre diferentes métodos de hacer las cosas.


19
-1: El uso de comillas simples no tiene ningún efecto en la vida real sobre el rendimiento. La página vinculada muestra diferencias entre los dos métodos en microsegundos , es decir, 0.000001 segundos. Cualquier consulta de base de datos tomará cientos de veces ese tiempo. Este debate es completamente inútil.
Pekka

Buen punto para mencionar \r, \ny \tcomo otras respuestas no incluyeron este bit.
evilReiko

2

Solo es cuestión de gustos.
Usa lo que quieras.

La mayoría de las veces estoy usando el segundo pero depende.

Permítame sugerirle que también obtenga un buen editor que resalte una variable dentro de una cadena


Tengo el área de texto necesaria. PSPad rocas.
Web_Designer

2

No concatenar. No es necesario, las comas como echo pueden tomar múltiples parámetros

echo "Welcome ", $name, "!";

Con respecto al uso de comillas simples o dobles, la diferencia es insignificante, puede hacer pruebas con un gran número de cadenas para probarlo usted mismo.


66
Sin embargo, esto solo se aplica al eco. Pruébalo para una asignación variable y mira cómo explota tu código.
Marc B

1

Deberías elegir el primero. No tienen ninguna diferencia, excepto el rendimiento, el primero será el rápido en comparación con el segundo.

Si la variable dentro de la comilla doble PHP toma tiempo para analizar la variable.

Echa un vistazo a estas comillas simples o comillas dobles para concatenación variable?

Este es otro ejemplo. ¿Hay un beneficio de rendimiento entre comillas simples y comillas dobles en php?

No entendí por qué esta respuesta en el enlace anterior se votó y por qué esta respuesta se votó negativamente.

Como dije lo mismo.

Puedes mirar aquí también

¿Qué es más rápido en PHP, comillas simples o dobles?


55
-1 para optimización prematura. La diferencia en el rendimiento no es suficiente para ser un factor a menos que esté imprimiendo millones de veces en una secuencia de comandos, e incluso entonces, cualquier otro procesamiento que haga reducirá los segundos adicionales que podría pasar imprimiendo de una manera en lugar de la otra. . La principal diferencia entre ellos es la legibilidad (lo que me lleva a preferir el segundo estilo).
cHao

1
Puedo intentar responder tu última pregunta. Hay muchos rumores salvajes en la comunidad PHP y algunos de ellos son muy fuertes. Es una gran lucha revelarlos y lleva tiempo. Pero lentamente está cambiando. Entonces, la respuesta a la que se vinculó es la anterior, de los tiempos en que a las personas no les importaba. Mientras que en este caso algunas personas respondieron en base a su propia experiencia, no en algún artículo que leyeron.
Su sentido común

La pérdida de rendimiento es falsa +1 @cHao. Aquí hay un artículo con las métricas que lo demuestran. nikic.github.io/2012/01/09/…
Damian

1

Si desea ejecutar un SQLcomando y sus variables son miembros de la matriz, entonces no debe usar comillas simples dentro []de la matriz (así:) ['']; por ejemplo, si usa esta cadena como un comando SQL, obtendrá server error 500:

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

La cadena correcta es:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";

Debería usar
PDO en su

0

Sé que esta es una vieja pregunta, pero creo que alguien tiene que mencionar todos los pros y contras:

Mejor sintaxis : esa es la preferencia personal.

Rendimiento : no hay diferencia. Como muchos mencionaron, la comilla doble podría ser más rápida si se usan muchas variables poco realistas.

Mejor uso : comilla simple (principalmente). Como dijo @Khez, la comilla simple puede concatenar cualquier cosa, incluso las llamadas de función y variable modificación, así: echo 'hi ' . trim($name) . ($i + 1);. Lo único comillas dobles puede hacer que comilla simple no puede hacer es el uso de \n, \r, \ty similares.

Legibilidad : no hay diferencia (puede aplicarse preferencia personal).

Posibilidad de escritura / reescritura / depuración : en las declaraciones de 1 línea no hay diferencia, pero cuando se trata de varias líneas, es más fácil comentar / descomentar líneas mientras se depura o escribe. Por ejemplo:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

Menos escape : comilla simple. Para comillas simples, necesita escapar solo de 2 caracteres ( 'y \). Para una comilla doble, debe escapar 2 caracteres ( ", \) y 3 más si es necesario ( $, {y }).

Menos cambios : comilla simple. Por ejemplo, si tiene el siguiente código:

echo 'Number ' . $i . '!';

Y necesita incrementar 1 a $ i, para que se convierta en Me gusta:

echo 'Number ' . ($i + 1) . '!';

Pero para una cita doble, deberá cambiar esto:

echo "Number $i!";

a esto:

echo "Number " . ($i + 1) . "!";

Conclusión : usa lo que prefieras .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.