10

是否有区别或比以下另一种更好:

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

或者

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

是否存在速度差异,或者有理由选择一个而不是另一个?

4

9 回答 9

23

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";
于 2009-01-10T20:19:22.810 回答
7

如果您回显字符串,则存在细微差别。

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

略快于

echo $var1.$var2.$var3 // dot   (concat and echo)
于 2009-01-10T19:31:40.627 回答
6

几个短的字符串无关紧要。使用更清晰的阅读方式。

但是,如果您有很多(比如数千个)而不是那么短的,您可能希望将它们保持在一个数组中并将它们连接在一起。(碰巧这样的代码通常像使用“。=”连接字符串一样容易阅读,因此您不会牺牲性能祭坛上的清晰度。)

编辑:我不认为我的上述想法是有效的。PHP 的字符串是可变的,对吧?

于 2009-01-10T19:32:00.923 回答
3

不会有什么不同。两者都是串联,所以最容易阅读的就是你应该使用的。

如果您追求最佳性能,请尝试使用数组,然后在完成后将其内爆。

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

无论如何,除非您使用数千个大字符串,否则速度差异将可以忽略不计。

于 2009-01-10T20:27:07.567 回答
2

对于您在代码中手动连接的任何内容,性能可能并不重要,因此可读性是王道。对我来说,这通常意味着使用heredoc语法。我不喜欢它破坏我的缩进结构的方式,但是当您希望将换行符和/或制表符正确插入到您的字符串中时,它特别好。

于 2009-01-10T20:01:13.547 回答
0

我想你不会注意到这么短的情况。我通常出于可读性的原因决定使用哪个。我只在两种情况下分开,否则在一行:

a) 创建一个多行响应,以便代码在某种程度上模仿用户将看到的内容。我发现这样更容易发现错别字和错误。

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

b) 行长。如果该行会溢出我的窗口,我通常会将其拆分,这样我就不必走到行尾来阅读结尾。大多数语言都支持换行符,所以我真的不需要在代码中物理地破坏它,但这只是我的一个习惯,因为我确实在一些没有它的语言中工作。

于 2009-01-10T19:27:54.987 回答
0

将大量数据放入单个字符串的最快方法是输出缓冲以捕获 echo 的输出。

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

一般来说,它不太可能对您的程序速度产生显着影响,所以让您在做什么看起来很明显,因为无论如何您必须稍后再回来修复/更新它。可读性为王。

于 2009-01-10T20:07:49.120 回答
0

没有有意义的区别。这只是编码偏好的问题。

于 2009-01-11T10:14:35.183 回答
0

我有一种预感,制作一个数组然后内爆可能是最快的方法。我错了!但是,执行 $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
于 2015-11-13T02:46:10.490 回答