使用.运算符或双引号来连接PHP字符串

5

在PHP中,哪种方法更好用来连接字符串?

选项A:使用 . 运算符来连接字符串。

编辑 - 我的问题不仅仅涉及性能,我还想知道每种方法的缺点,并且是否存在某种情况下应该优先选择其中一种方法。

$string1 = "hello ";
$string2 = $string1 . "world !";

选项B:使用双引号。
$string1 = "hello ";
$string2 = "$string1 world !";

我知道这两种方法实际上做的是相同的事情。在我的个人开发中,我更喜欢使用“.”运算符。

我的问题只是因为我读到过这样的说法:“.”运算符会强制PHP在每次添加新字符串时重新连接。所以,在下面这个例子中:

$string1 = "hello ";
$string2 = "world";
$string3 = $string1.$string2." !";

实际上会比...运行得更慢

$stirng1 = "hello";
$string2 = "world";
$string3 = "$string1 $string2 !";

参考:PHP语言运算符 > 字符串


4
你的服务器遇到了任何性能问题吗?请使用最容易阅读的方式告诉下一个程序员! - Kerrek SB
2
我认为连接字符串会更快,因为后者需要解析文本并查找$表达式或使用eval(),这可能要慢得多。 - Amir Raminfar
实际上,如果您阅读参考资料,作者说concat更快。 “我运行了以下脚本,并发现使用“$var”比使用“ '.$var”'大多数情况下要慢。” - Amir Raminfar
使用双引号版本会不会在结果中添加额外的空格?(如果您生成HTML,这可能是不可见的。) - Paŭlo Ebermann
@rlemon:有趣的是,我很想知道更改字符串连接是否有帮助! - Kerrek SB
显示剩余3条评论
3个回答

5

在你开始担心这个问题之前,你需要看看是否值得考虑。我思考了一下,并编写了下面这个简短的脚本,运行它以查看基准测试结果。

对于每个循环,我进行了100,000次操作。现在,我没有将我的字符串打印在任何地方,所以如果 PHP 优化器因此把我的所有工作都消除掉,那么我很抱歉。然而,从这些结果来看,每个操作的差异大约只有0.00001秒左右。

在为其他优化而不是可读性进行优化之前,请使用分析器并查看您的热点在哪里。如果您运行数千万次拼接操作,则可能有争议。但是,对于1000次操作,您仍然要考虑0.01秒的差异。我相信您可以通过优化 SQL 查询等方式节省超过0.01秒的时间。

以下是我的证据...

这是我运行的内容:

<?php
for($l = 0; $l < 5; $l++)
  {
    echo "Pass " .$l. ": \n";
    $starta = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = "$a $b".' Hello';
      }
    $enda = microtime(1);

    $startb = microtime(1);
    for( $i = 0; $i < 100000; $i++)
      {
    $a = md5(rand());
    $b = md5(rand());
    $c = $a . ' ' . $b . ' Hello';
      }
    $endb = microtime(1);


    echo "\tFirst method: " . ($enda - $starta) . "\n";
    echo "\tSecond method: " . ($endb - $startb) . "\n";
  }

以下是结果:

Pass 0: 
    First method: 1.3060460090637
    Second method: 1.3552670478821
Pass 1: 
    First method: 1.2648279666901
    Second method: 1.2579910755157
Pass 2: 
    First method: 1.2534148693085
    Second method: 1.2467019557953
Pass 3: 
    First method: 1.2516458034515
    Second method: 1.2479140758514
Pass 4: 
    First method: 1.2541329860687
    Second method: 1.2839770317078

那是一个非常好的例子。我也在寻找关于这两种方法的信息,以及应该在何时或何处使用它们。 - rlemon
说实话,我会编写最明显的代码,以便其他开发人员能够理解。我的个人偏好是使用连接运算符($a . ' ' . $b)而不是插值("$a $b")。 - KyleWpppd
好的,我同意。然而,我的问题还没有得到回答。是否存在一种情况,其中一个应该优先使用,还是仅仅是个人偏好的问题? - rlemon
1
为此,我会说是的,有一个条件,那就是:使用更易读的内容。如果这与速度相矛盾,在极端情况下,那么就优化速度。请记住,您或其他人将不得不回来维护代码。我知道这是一个讽刺的回答,但实际上有比速度更重要的事情需要优化。优化代码的清洁度和未来的可维护性。 ;) - KyleWpppd

4

字符串拼接比插值表达式的速度通常更快,但是它们之间的差异很少具有足够的重要性来引起关注。尽管如此,我还是更喜欢使用字符串拼接,因为它在编辑时更容易修改(例如,当您想将一个字符串更改为方法或函数调用时)。也就是说,从:

$s1 = 'this ' . $thing . ' with a thing';

致:

$s1 = 'this ' . blarg($thing) . ' with a thing';

编辑:当我说“串联几乎总是比插值更快”时,我的意思是,我实际上已经对许多不同形式的它进行了基准测试,而我不只是猜测或重申别人的帖子。这很容易做到,请尝试。


这可能是环境的结果吗?我已经运行了此处发布的测试http://www.php.net/manual/en/language.operators.string.php#71062,我发现插值运行速度略快。 - rlemon
当然,这也可能会根据您的操作系统、PHP版本、字符串长度、编译的字符串数量、湿度和月相而发生变化。这就是为什么您永远不应该询问任何其他人什么更快,并始终使用您自己的代码,在您自己的硬件上进行测量。 - Alex Howansky
我更新了我的帖子,性能是一个问题。请阅读上面的编辑内容。虽然你说得没错,但不必如此严厉。一个简单的“是”就足够了。 - rlemon
没有任何恶意,只是想强调你应该养成自己进行性能测试的习惯,因为有很多不同的因素会影响结果。 - Alex Howansky
如果您读了我的评论,我已经运行了一个测试,而我的结果与您的结果相矛盾。这就是为什么我问环境会如何影响这样一个基本操作。 - rlemon

2
如果您需要一次性连接大量字符串,请考虑使用implode()
$result = implode('', $array_of_strings);

对于字符串数量不多的情况,使用哪种方法没有明显的区别。

字符串拼接在所有情况下都比数组方法更快。 - rlemon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接