在PHP中,如何将变量与字符串连接或直接插入字符串中?

297

我想知道,将PHP变量插入字符串的正确方式是什么?

是这样的:

echo "Welcome ".$name."!"

或者这样做:

echo "Welcome $name!"

这两种方法在我的 PHP v5.3.5 中都有效。后者更简短、更简单,但我不确定第一种是否更好的格式化或被认为更合适。


19
如果您在进行第一步操作,我个人更喜欢使用单引号 echo 'Welcome '.$name.'!'; - KJYe.Name
1
http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double - Dejan Marjanović
16
个人而言,我不太在意“单引号更高效”的说法,我只是选择“使用需要最少内部转义的引号风格”。极有可能你编写的任何代码都不会因为少量字符串解析而获得微小的收益,相对于增加字符串连接的操作。 - Marc B
3
性能损失的说法是错误的。请参考此文章:https://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html - Damian
这很有趣;如何定义“注意到了多少?”即使在2011年,差异也只会出现在亚毫秒级别的噪音中。任何人都不可能完全察觉到,对吧?这种速度差异的概念可能比(现在已被证明是错误的)职业大提琴手能够分辨斯特拉迪瓦里乌斯和克隆品的说法更加可疑。 - SO_fix_the_vote_sorting_bug
显示剩余2条评论
16个回答

447

在这两种语法中,你应该选择自己更喜欢的那一种 :-)

就我个人而言,在这种情况下(变量插值),我会选择你的第二种解决方案,因为我觉得它更容易编写和阅读。

结果将是相同的;即使存在性能影响,也不会有影响。1


作为一个旁注,为了让我的回答更加完整,假设你日后想要做这样的事情:

echo "Welcome $names!";

PHP 会将您的代码解释为尝试使用不存在的 $names 变量。请注意,只有在使用双引号 "" 而不是单引号 '' 时才能起作用。

那一天,您将需要使用 {}

echo "Welcome {$name}s!"

无需回退到连接字符串。


同时请注意您的第一个语法:

echo "Welcome ".$name."!";

可能可以进行优化,避免使用字符串拼接,使用以下代码:

echo "Welcome ", $name, "!";

(但是,就像我之前说过的那样,这并不太重要...)


1 - 除非你正在执行数十万次的连接操作而不是插值操作 -- 这种情况可能并不太常见。


81
请注意,用逗号将字符串文字和变量分开只适用于echo命令,而不是其他任何地方。 - colincameron
4
关于性能方面,只是指出:运行time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(字符串拼接)实际上比使用插值(time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");')慢了大约300毫秒(对于20万个元素,每千个元素的时间差为1毫秒)。这种差别可以归因于统计误差,无法测量到任何实质性的差异。考虑到它更易读性,使用插值(time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");')毫无争议地获胜... - Fernando Cordeiro
1
如果想要使用插值,你必须使用双引号。 - Máxima Alekz
能否在字符串中使用函数?比如 echo "这是{foo()}很好的";? - strix25
不,这是不可能的。此外,插值方法({})也不能与常量一起使用。 因此,我认为这种插值不是正确的方式。 你应该问自己为什么不使用连接。 如果你找不到一个合理的答案,你应该优先选择连接而不是插值。 虽然我还没有测试过它,但我认为两种方法之间没有明显的性能差异。 如果有任何差异,它们在一个无法察觉的时间范围内(最多几毫秒),就像单引号和双引号之争一样。 - Alexander Behling

23

双引号字符串更优雅,因为每次需要插入变量时,不必像单引号字符串那样打破字符串。

但是,如果您需要插入函数的返回值,则无法将其插入双引号字符串中,即使您用大括号{}将其包裹起来也不行!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

11
您可以通过 PHP 5.3 变量函数将函数半间接地插入字符串中。例如 $x = function() { ...}; $string = "hello {$x(blah blah blah)}",这种方法可以绕过“限制”。 - Marc B
5
很酷,我不知道这个!你还可以将现有函数的名称分配给一个变量,并执行相同的操作:$x = 'trim'; $string = "hello {$x('blah blah blah')}"; - Michael
3
那很酷,但极难阅读,所以我们还是要尽量避免使用它。 - Your Common Sense
2
$s = 'Hello ' . trim($world) .'!'; 当字符串中没有插值时,请尝试使用单引号。这将提高性能,并可用作标识符。 - Sarath Sadasivan Pillai

15

自 PHP4 开始,您可以使用字符串格式化器:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

来源:sprintf()


目前来看,这是最安全的选择。+1 是为了好的实践和符合其他语言的一般约定。 - Javier Arias

13

我一直都更喜欢这个,并且发现它更容易。

echo "Welcome {$name}!"

这也适用于嵌套数组,如$matches[0][1] - alpha-helix

6

从让事情变得简单可读一致易于理解的角度来看(因为性能在这里并不重要):

  • 在双引号中使用嵌入式变量可能会导致复杂和混乱的情况,当您想要嵌入对象属性、多维数组等时。

    也就是说,通常在阅读嵌入式变量时,您无法立即100%确定您正在阅读的最终行为。

  • 您经常需要添加诸如{}\之类的支架,我认为这增加了混淆,并使连接可读性几乎相等,如果不是更好。

  • 一旦您需要在变量周围包装一个函数调用,例如htmlspecialchars($var),您必须切换到连接。

  • 据我所知,您无法嵌入常量。

在某些特定情况下,“带有变量嵌入的双引号”可能很有用,但总体而言,我会选择连接(在方便时使用单引号或双引号)。


5

两者都可以。使用对你更容易理解的那个。说到可视性,你也可以查看printf


5

我知道这个问题已经有一个被选中的答案,但是我发现这篇文章明显表明字符串插值比串联更快。对于那些还在犹豫的人可能会有所帮助。


5

我使用点(.)将字符串和变量连接起来,像这样-

echo "Hello ".$var;

有时候,我使用花括号来连接字符串和变量,它看起来像这样-
echo "Hello {$var}";

3

首选使用单引号!

  1. 这样更容易阅读,其他程序员能够了解发生了什么
  2. 它的工作速度略快,当PHP分析源代码时,操作码的创建方式基本上会这样做,因此可以帮助它一把!
  3. 如果您还使用单引号而不是双引号,您的性能将得到进一步提高。

唯一需要使用双引号的情况是需要使用 \r, \n, \t时!在任何其他情况下使用它的开销都不值得。

您还应该查看PHP变量拼接,以及phpbench.com中有关执行不同方法的基准测试。


20
在性能方面,使用单引号与双引号并没有任何实际影响。链接的页面展示了两种方法之间的差异,以微秒为单位,即0.000001秒。任何数据库查询所需的时间都将是其几百倍。这场辩论完全是毫无意义的。 - Pekka
提到\r\n\t是个好点子,其他答案没有包括这一部分。 - evilReiko

3

不要连接字符串。没必要这么做,可以使用逗号,因为echo命令可以接受多个参数。

echo "Welcome ", $name, "!";

关于使用单引号或双引号的区别可以忽略不计,您可以测试大量字符串以自行测试。


6
这仅适用于echo命令。如果尝试变量赋值,你会看到你的代码崩溃。 - Marc B

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