是否存在差异,或者是否优于以下其他方面:

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

除非你正在使用成千上万的大字符串,否则无论如何你都可以忽略速度差异。

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

我认为你不会注意到这么短暂的情况。我通常决定出于可读性的原因,我将使用它。我只分为两种情况,否则在一条线上:

a)创建多行响应,使代码在某种程度上模仿用户将看到的内容。我发现这样可以更容易地捕捉拼写错误和错误。

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

b)线长。如果该行将溢出我的窗口,我通常会将其分解,因此我不必一直到行尾来阅读结尾。大多数语言都支持一个行继续符,所以我真的不需要在代码中进行物理分解,但这只是一种习惯,因为我在一些没有它的语言中工作。

将大量数据转换为单个字符串的最快方法是输出缓冲以捕获回声输出。

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