PHP: лучше ли объединять в одну или несколько строк? Или есть разница? - PullRequest
9 голосов
/ 10 января 2009

Есть ли разница или она лучше, чем другая из следующих:

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

Или

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

Есть ли разница в скорости или есть причина, по которой вы выбираете одно из другого?

Ответы [ 9 ]

22 голосов
/ 10 января 2009

И PEZ, и Topbit верны. Я просто хочу указать на то, что, на мой взгляд, выглядит лучше, чем было видно здесь:

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

против

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

Я предпочитаю второй первый, так как визуально очевидно, что ваш результат - одна строка $ var. Это также предотвращает глупые ошибки, такие как:

$var  = "line 1 \n";
$var .= "line 2 \n";
$vat .= "line 3 \n";
$var .= "line 4 \n";
7 голосов
/ 10 января 2009

Существует небольшая разница, если вы повторяете строку.

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

немного быстрее, чем

echo $var1.$var2.$var3 // dot   (concat and echo)
6 голосов
/ 10 января 2009

Это не имеет значения для нескольких коротких строк. Используйте то, что понятнее для чтения.

Но если у вас их много (скажем, тысяч), не таких коротких, вы, вероятно, захотите сохранить их в массиве и объединить вместе. (Так получается, что такой код часто так же легко читать, как и конкатенацию строк с использованием «. =», Поэтому вы не жертвуете ясностью в отношении алтаря производительности.)

РЕДАКТИРОВАТЬ: Я не думаю, что мои вышеуказанные мысли верны. Строки PHP изменчивы, верно?

3 голосов
/ 10 января 2009

Не имеет значения. И то, и другое - конкатенация, поэтому все, что легче читать, это то, что вам следует использовать.

Если вы добиваетесь лучших результатов, попробуйте использовать массив, а затем взорвите его, когда закончите.

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

В любом случае разница в скорости будет незначительной, если вы не работаете с тысячами больших струн.

2 голосов
/ 10 января 2009

Для всего, что вы объединяете вручную в коде, производительность, вероятно, не имеет значения, поэтому удобочитаемость - главное. Для меня это часто означает использование синтаксиса heredoc . Мне не нравится, как это нарушает мою структуру отступов, но особенно приятно, когда вы хотите, чтобы разрывы строк и / или вкладки правильно вставлялись в ваши строки.

0 голосов
/ 13 ноября 2015

У меня было предчувствие, что создание массива, а затем его внедрение может быть самым быстрым способом Я был неправ! Однако выполнение $ str = $ str + $ bla ДЕЙСТВИТЕЛЬНО медленно на порядок! Это имеет значение, только если вы делаете кучу конкатенаций. Вот мой тестовый код:

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

Вот результаты, которые я получил:

 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
0 голосов
/ 11 января 2009

Нет значимой разницы. Это просто вопрос предпочтения кодирования.

0 голосов
/ 10 января 2009

Самый быстрый способ получить большой объем данных в одну строку - это буферизация вывода для захвата эхосигнала.

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

В целом, вряд ли это существенно повлияет на скорость вашей программы, поэтому сделайте так, чтобы она выглядела совершенно очевидно, что вы делаете, поскольку вам все равно придется вернуться, чтобы исправить или обновить ее позже. Читаемость - король.

0 голосов
/ 10 января 2009

Не думаю, что вы заметите такую ​​короткую ситуацию. Я обычно решаю по причинам удобочитаемости, которые я собираюсь использовать. Я делю только на две ситуации, в противном случае на одну строку:

a) Создание многострочного ответа, чтобы код несколько имитировал то, что увидит пользователь. Я обнаружил, что таким образом легче ловить опечатки и ошибки.

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

б) длина линии. Если строка переполняет мое окно, я обычно разбиваю ее, поэтому мне не нужно идти до конца строки, чтобы прочитать конец. Большинство языков поддерживают символ продолжения строки, поэтому мне не нужно физически разбивать его в коде, а просто привычка, так как я работаю на некоторых языках, у которых его нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...