PHP: É melhor para concatenar em 1 ou várias linhas? Ou há uma diferença?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Existe uma diferença ou é um melhor que o outro dos seguintes:

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

ou

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

Existe uma diferença de velocidade ou há uma razão por que você iria escolher um sobre o outro?

Foi útil?

Solução

Há uma pequena diferença se você ecoar a string.

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

é ligeiramente mais rápido do que

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

Outras dicas

Ambos PEZ e Topbit estão corretas. Eu só quero salientar algo que eu acho que parece melhor do que foi visto aqui:

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

contra

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

Eu prefiro muito mais o segundo para o primeiro como visualmente é óbvio o seu resultado é a string $ var. Ele também evita erros estúpidos como:

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

Não importa para alguns, curtas e cordas. Use o que é mais claro para ler.

Mas se você tem muitos deles (milhares Say) aqueles não tão curto, você provavelmente vai querer mantê-los em uma matriz e juntá-las. (Como acontece esse código é muitas vezes tão fácil de ler como concatenar as strings usando "=", então você não está sacrificando a clareza sobre o altar do desempenho.)

EDIT: Eu não acho que o meu pensamento acima é válido. cordas do PHP são mutáveis, certo?

Não vai fazer a diferença. Ambos são concatenação, de modo que é mais fácil de ler é o que você deve usar.

Se você estiver após o melhor desempenho, tente usar uma matriz e, em seguida, implodir-lo quando tiver terminado.

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

Qualquer maneira que você faz a diferença de velocidade será insignificante a menos que você está trabalhando com milhares de grandes cadeias.

Para qualquer coisa que você está concatenando manualmente no código, o desempenho provavelmente não importa, por isso, a legibilidade é rei. Para mim, isso muitas vezes significa usar sintaxe heredoc . Eu não gosto da maneira como ele quebra minha estrutura recuo, mas é especialmente agradável quando você quer quebras de linha e / ou tabulações inseridas corretamente em suas cordas.

Eu não acho que você vai notar em uma situação tão curto. Eu normalmente decidir, por razões de legibilidade, que eu vou usar. Eu só dividir em duas situações, caso contrário, em uma linha:

a) Criação de uma resposta multi-line para que o código um tanto imita o que o usuário vai ver. Descobri que torna mais fácil para pegar erros de digitação e erros desta forma.

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

b) o comprimento da linha. Se a linha vai transbordar minha janela eu vou normalmente dividi-lo, então eu não tenho que ir para o fim da linha para ler o final. A maioria das linguagens apoiar um caractere de continuação, então eu realmente não precisa de quebrá-lo fisicamente no código, mas apenas um hábito que eu tenho desde que eu fazer o trabalho em alguns idiomas que não tê-lo.

A maneira mais rápida de obter uma grande quantidade de dados em uma única cadeia, é o buffer de saída para a saída de captura echo'd.

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

Em geral, é pouco provável que faça uma diferença significativa para a velocidade do seu programa, então fazê-lo parecer óbvio que você está fazendo, pois você tem que voltar a correção / atualizá-lo mais tarde, de qualquer maneira. Legibilidade é rei.

Não há nenhuma diferença significativa. É apenas uma questão de codificação de preferência.

Eu tinha um palpite de que fazer uma matriz e, em seguida, implosão pode ser o caminho mais rápido. Eu estava errado! No entanto fazendo um $ str = $ str + $ bla é realmente lento por ordem de grandeza! Isso só importa se você está fazendo uma tonelada de concatenations. Aqui está o meu código de teste:

<?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 );

Aqui estão os resultados que eu tenho:

 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top