PHP:Что лучше объединить в 1 строку или несколько строк?Или есть какая-то разница?

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

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

Или

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

И 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";

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

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

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

Это не будет иметь значения.Оба являются конкатенацией, поэтому вам следует использовать то, что легче читать.

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

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

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

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

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

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

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

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

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

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

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

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

У меня было подозрение, что создание массива и его последующее сжатие может быть самым быстрым способом.Я был неправ!Однако выполнение $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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top