PHP: ¿Es mejor concatenar en 1 línea o en varias líneas? ¿O hay alguna diferencia?

StackOverflow https://stackoverflow.com/questions/431569

  •  08-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna diferencia o es mejor que la otra de lo siguiente?

$var = '';
...
$var .= 'blah blah';
$var .= $var2;
$var .= 'blah blah';

O

$var = '';
...
$var .= 'blah blah' . $var2 . 'blah blah';

¿Hay una diferencia de velocidad o hay una razón por la que elegirías una sobre la otra?

¿Fue útil?

Solución

Hay una pequeña diferencia si haces eco de la cadena.

echo $var1,$var2,$var3 // comma (echo with multiple arguments)

es ligeramente más rápido que

echo $var1.$var2.$var3 // dot   (concat and echo)

Otros consejos

Tanto PEZ como Topbit son correctos. Solo quiero señalar algo que creo que se ve mejor de lo que se ha visto aquí:

$var  = "line 1 \n";
$var .= "line 2 \n";

versus

$var = "line 1 \n"
     . "line 2 \n";

Prefiero el segundo al primero, ya que visualmente es obvio que su resultado es la cadena $ var. También evita errores estúpidos como:

$var  = "line 1 \n";
$var .= "line 2 \n";
$vat .= "line 3 \n";
$var .= "line 4 \n";

No importa para unas pocas cadenas cortas. Use lo que sea más claro para leer.

Pero si tienes muchos (digamos miles) no tan cortos, probablemente quieras mantenerlos en una matriz y unirlos. (Como suele suceder, dicho código suele ser tan fácil de leer como concatenar las cadenas con ". = & Quot ;, por lo que no sacrifica la claridad en el altar de la interpretación).

EDITAR: No creo que mi pensamiento anterior sea válido. Las cadenas de PHP son mutables, ¿verdad?

No hará la diferencia. Ambos son concatenación, por lo que lo que sea más fácil de leer es lo que debe usar.

Si buscas el mejor rendimiento, intenta usar una matriz y luego implosiona cuando hayas terminado.

$var = array();
$var[] = "line 1\n";
$var[] = "line 2\n";
$var[] = "line 3";
$var = implode('', $var);

De cualquier forma que lo haga, la diferencia de velocidad será insignificante a menos que esté trabajando con miles de cadenas grandes.

Para cualquier cosa que esté concatenando manualmente en el código, el rendimiento probablemente no importa, por lo que la legibilidad es lo más importante. Para mí, esto a menudo significa usar sintaxis heredoc . No me gusta la forma en que rompe mi estructura de sangría, pero es especialmente agradable cuando quieres que los saltos de línea y / o las pestañas se inserten correctamente en tus cadenas.

No creo que te des cuenta de una situación tan corta. Por lo general, decido por razones de legibilidad que voy a usar. Solo me separé en dos situaciones, de lo contrario en una línea:

a) Crear una respuesta de varias líneas para que el código imite lo que verá el usuario. Descubrí que hace que sea más fácil detectar errores tipográficos y errores de esta manera.

$var  = "line 1 \n";
$var .= "line 2 \n";

b) longitud de línea. Si la línea desborda mi ventana, típicamente la dividiré para no tener que ir al final de la línea para leer el final. La mayoría de los idiomas admiten un carácter de continuación de línea, por lo que realmente no necesito dividirlo físicamente en el código, pero solo es un hábito que tengo, ya que trabajo en algunos idiomas que no lo tienen.

La forma más rápida de obtener una gran cantidad de datos en una sola cadena, es el almacenamiento en búfer de salida para capturar la salida con eco.

ob_start();
/* many echos. For example, in a loop */
$outString = ob_get_contents(); // get the complete string
ob_end_clean();

En general, es poco probable que marque una diferencia significativa en la velocidad de su programa, así que haga que parezca obvio lo que está haciendo, ya que de todos modos tiene que volver para arreglarlo / actualizarlo. La legibilidad es el rey.

No hay diferencia significativa. Es solo una cuestión de codificación de preferencias.

Tenía el presentimiento de que hacer una matriz y luego implosionar podría ser la forma más rápida. ¡Estaba equivocado! ¡Sin embargo, hacer un $ str = $ str + $ bla es REALMENTE lento por orden de magnitud! Solo importa si estás haciendo un montón de concatenaciones. Aquí está mi código de prueba:

<?php

function doit($n) {

    $str2concat = 'Esta es una prueba. ¿Cuál manera es más rápida?';

    $str = '';

    // option 1
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str .= $str2concat;
    }

    $end = microtime(true);
    echo " Concat: $n Iterations, duration:" . ($end-$start) . "\n";

    // option 2
    $str = '';
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str = $str . $str2concat;
    }

    $end = microtime(true);
    echo "Concat2: $n Iterations, duration:" . ($end-$start) . "\n";

    // option 3
    $str = [];
    $start = microtime(true);

    for( $i=0; $i <= $n; $i++ ) {
        $str[] = $str2concat;
    }

    $str = implode( $str );
    $end = microtime(true);
    echo "Implode: $n Iterations, duration:" . ($end-$start) . "\n\n";

}

doit( 5000 );
doit( 10000 );
doit( 100000 );

Aquí están los resultados que obtuve:

 Concat: 5000 Iterations, duration:0.0031819343566895
Concat2: 5000 Iterations, duration:0.41280508041382
Implode: 5000 Iterations, duration:0.0094010829925537

 Concat: 10000 Iterations, duration:0.0071289539337158
Concat2: 10000 Iterations, duration:1.776113986969
Implode: 10000 Iterations, duration:0.013410091400146

 Concat: 100000 Iterations, duration:0.06755805015564
Concat2: 100000 Iterations, duration:264.86760401726
Implode: 100000 Iterations, duration:0.12707781791687
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top