PHP - 连接或直接在string中插入变量

Web*_*ner 207 php string variables concatenation

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

这条路:

echo "Welcome ".$name."!"
Run Code Online (Sandbox Code Playgroud)

或者这样:

echo "Welcome $name!"
Run Code Online (Sandbox Code Playgroud)

这两种方法都适用于我的PHP v5.3.5.后者更短更简单,但我不确定第一个是更好的格式还是更合适.

Pas*_*TIN 322

在这两种语法之间,您应该选择您喜欢的语法:-)

就个人而言,我会在这种情况下使用你的第二个解决方案(可变插值),我发现它更易于写入和读取.

结果将是一样的; 即使有性能影响,这些也无关紧要1.


作为旁注,所以我的回答更完整:你想做这样的事情的那一天:

echo "Welcome $names!";
Run Code Online (Sandbox Code Playgroud)

PHP将解释您的代码,就像您尝试使用$names变量一样 - 这是不存在的.

那天,你需要使用{}:

echo "Welcome {$name}s!"
Run Code Online (Sandbox Code Playgroud)

无需回退到连接.


另请注意您的第一个语法:

echo "Welcome ".$name."!";
Run Code Online (Sandbox Code Playgroud)

可能可以优化,避免连接,使用:

echo "Welcome ", $name, "!";
Run Code Online (Sandbox Code Playgroud)

(但是,正如我之前所说,这并不重要......)


1 - 除非你正在进行成千上万的连接与插值 - 而且情况可能并非如此.

  • 只是注意用逗号分隔字符串文字和变量只适用于`echo`,而不是其他任何地方. (59认同)
  • 非常好,谢谢!很高兴知道我可以使用我最喜欢的方法将它直接插入到字符串中,我非常感谢现在知道如果需要使用`{}`,如何将变量与其余的sting分开. (3认同)
  • 只是指出性能:`time php -r'$ string =""; for($ i = 0; $ i <199999; $ i ++){$ string = $ string.$ i; } print("Done!\n");'`(Concatenation)实际上损失了大约300毫秒(对于200,000个项目,你的集合中每千个元素就有1个miliseconf ......).这是统计噪音,甚至无法衡量任何差异.考虑到它更具可读性,`time php -r'$ string =""; for($ i = 0; $ i <199999; $ i ++){$ string ="{$ string} {$ i}"; 打印("完成!\n");'`(插值)是无可争议的赢家...... (3认同)

Mic*_*ael 17

双引号字符串更优雅,因为每次需要插入变量时都不必分解字符串(就像必须使用单引号字符串一样).

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

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

//the only option
$s = "Hello " . trim($world) . "!";
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过PHP 5.3变量函数将函数半间接插入到字符串中.`$ x = function(){...}; $ string ="hello {$ x(blah blah blah)}"`,它围绕"限制"工作. (9认同)
  • @Marc那很酷,我不知道!您还可以将现有函数的名称赋给变量并执行相同的操作:`$ x ='trim'; $ string ="hello {$ x('blah blah blah')}";` (5认同)
  • 那很酷但是非常难以理解,所以无论如何都要避免它. (3认同)
  • `$ s ='你好'.修剪($ world).'!';`当没有任何内容可以在字符串中插入时,尝试使用单引号.它将提高性能并可用作识别两者的约定 (2认同)

Mud*_*lia 13

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

echo "Welcome {$name}!"
Run Code Online (Sandbox Code Playgroud)


Oli*_*oyo 8

从php4开始你可以使用字符串格式化器:

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


Man*_*kis 6

任何一个都没问题.使用具有更好可见性的那个.谈到可见性,您还可以查看printf.


Fro*_*y Z 5

从 make thinks simplereadable一致易于理解的角度来看(因为这里的性能并不重要):

  • 当您想要嵌入对象属性、多维数组等时,在双引号中使用嵌入的变量会导致复杂和混乱的情况。也就是说,通常在读取嵌入的变量时,您无法立即 100% 确定您正在阅读的内容的最终行为.

  • 您经常需要添加诸如{}and 之类的拐杖\,这会增加 IMO 的混乱并使串联可读性几乎等效,甚至更好。

  • 例如htmlspecialchars($var),一旦您需要在 var 周围包装函数调用,就必须切换到串联。

  • AFAIK,您不能嵌入常量。

在某些特定情况下,“带有 vars 嵌入的双引号”可能很有用,但一般来说,我会去连接(方便时使用单引号或双引号)


Den*_*s V 5

我知道这个问题已经有了一个选择的答案,但是我发现这篇文章显然表明,字符串插值比串联更有效。对于仍存疑问的人可能会有帮助。


小智 5

我使用点(.) 连接字符串和变量。像这样-

echo "Hello ".$var;
Run Code Online (Sandbox Code Playgroud)

有时,我使用花括号来连接字符串和变量,如下所示-

echo "Hello {$var}";
Run Code Online (Sandbox Code Playgroud)