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

echo "Welcome ".$name."!"


或者这样的方法:

echo "Welcome $name!"


这两种方法都可以在我的PHP v5.3.5中使用。后者更短,更简单,但我不确定第一个格式是否更好,或更适合使用。

评论

如果您是第一次这样做,我个人更喜欢单引号echo'Welcome'。$ name。'!!';

php.net/manual/en / ...

@ kjy112我在回答中说了同样的话,我是单引号的巨大粉丝:X

我个人不理会整个“单引号更有效”,而只是选择“使用需要最后一次内部转义的任何一种引号样式”。由于较少的字符串解析v.s,因此您编写的任何代码极不可能从任何MICROSCOPIC收益中受益。增加了字符串连接。

绩效损失索赔是错误的。请参阅此文章作为参考:nikic.github.io/2012/01/09/…

#1 楼

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

就个人而言,在这种情况下,我将采用第二种解决方案(变量插值),我发现它更容易编写和编写。阅读。

结果将是相同的;即使有性能影响,也没关系1.


作为旁注,所以我的回答更完整:那天你要做类似的事情这:

echo "Welcome $names!";


PHP将解释您的代码,就像您尝试使用$names变量一样-该变量不存在。
-注意仅当您在字符串中使用“” not“时才有效。

那天,您需要使用{}

echo "Welcome {$name}s!"


无需回退连接。


还请注意,您的第一个语法:

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


可以优化,避免级联,使用:

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


(但是,正如我之前说的,这没什么关系...)

1-除非您正在做数十万个级联与插值运算-情况可能并非如此。

评论


非常好,谢谢!很高兴知道我可以使用最喜欢的方法将其直接插入字符串,并且非常感谢现在知道如何在需要使用{}的情况下将变量与其余字符串分开。

– Web_Designer
2011年4月9日15:51



请注意,用逗号分隔字符串文字和变量仅适用于echo,不适用于其他任何地方。

–colincameron
13年2月4日在12:35

只是指出性能:time php -r'$ string =“”;对于($ i = 0; $ i <199999; $ i ++){$ string = $ string。$ i; } print(“ Done!\ n”);' (串联)实际上损失了约300毫秒(对于200.000项,这是您的集合中每千个元素1 miliseconf ...)。这是统计噪音,甚至无法测量任何差异。考虑到它更具可读性,时间php -r'$ string =“”; for($ i = 0; $ i <199999; $ i ++){$ string =“ {$ string} {$ i}”; } print(“完成!\ n”);' (插值)是无可争议的赢家...

–费尔南多·科迪罗(Fernando Cordeiro)
2015年12月15日20:49在

如果要使用插值,则必须使用双引号。

–Máxima Alekz
16/12/26在6:21

是否可以在字符串中使用函数?像回声“这是{foo()}不错”; ?

– strix25
18/09/23在20:38

#2 楼

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

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

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

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


评论


您可以通过PHP 5.3变量函数将函数半间接地插入字符串中。 $ x = function(){...}; $ string =“ hello {$ x(blah blah blah)}”,它可以解决“限制”问题。

– Marc B
2011年4月9日在16:16

@Marc太酷了,我不知道!您还可以将现有函数的名称分配给变量,然后执行相同的操作:$ x ='trim'; $ string =“你好{$ x('blah blah blah')}”;

–迈克尔
2011年4月9日在16:33



那很酷,但极不可读,因此,无论如何都必须避免它。

–您的常识
2011年4月9日在16:42

$ s ='你好' trim($ world)。'!';当字符串中没有要插入的内容时尝试使用单引号,它将提高性能并可以用作识别两者的约定

–萨拉斯·萨达西万·皮莱
2015年5月7日12:31



#3 楼

从php4开始,您可以使用字符串格式化程序:

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


源:sprintf()

评论


到目前为止,最安全的选择。 +1是指与其他语言匹配的良好做法和常规惯例

–哈维尔·阿里亚斯(Javier Arias)
19年3月13日在12:48

#4 楼

两者都可以。使用对您而言可见性更好的一种。说到可见性,您还可以查看printf。

#5 楼

从使想法变得简单,可读,一致和易于理解的角度考虑(因为此处的性能无关紧要):


在双引号中使用嵌入式var可能导致复杂且当您要嵌入对象属性,多维数组等时,情况会令人困惑。
也就是说,通常在读取嵌入式var时,您不能立即100%确定所读取内容的最终行为。
您经常需要添加拐杖,例如{}\,这会增加IMO的混乱,并使串联可读性几乎相等,甚至更好。
一旦您需要将函数调用包装在var周围,例如htmlspecialchars($var),就必须切换进行串联。
AFAIK,您不能嵌入常量。

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

#6 楼

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

#7 楼

首先使用单引号!


它更易于阅读,这意味着其他程序员将知道发生了什么
它的工作速度稍快,这是在PHP剖析时创建操作码的方式您的源代码,基本上无论如何都会这样做,所以请帮帮忙!
如果您还使用单引号而不是双引号,则会进一步提高性能。

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

还应该检查一下PHP变量串联,phpbench.com提供了有关不同处理方法的一些基准。

评论


-1:使用单引号对性能没有任何现实影响。链接的页面显示两种方法之间的差异(以微秒为单位),即0.000001秒。任何一次数据库查询都将花费数百倍的时间。这场辩论完全没有意义。

– Pekka
2011年4月9日23:03



提到\ r,\ n和\ t的好点,因为其他答案不包括这一点。

–evilReiko
18 Mar 26 '18在9:55

#8 楼

我一直都喜欢这样做,发现它要容易得多。
echo "Welcome {$name}!"


#9 楼

只是味道而已。
随便使用。

我大部分时间都在使用第二个,但这要视情况而定。

让我建议您也让自己成为一个好的编辑器,该编辑器将突出显示字符串中的变量

评论


香港专业教育学院得到所需的textarea。 PSPad岩石。

– Web_Designer
2011年4月9日15:53

#10 楼

不要串联。不需要,我们用逗号分隔,因为echo可以采用多个参数

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


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

评论


不过,这仅适用于回声。尝试将其分配给变量,然后观察代码爆炸。

– Marc B
2011年4月9日在16:17

#11 楼

您应该选择第一个。它们没有区别,除了第一个的性能要比第二个的快。

如果双引号PHP中的变量需要时间来解析变量。

查看此单引号或双引号以进行变量串联吗?

这是另一个示例在php中,单引号和双引号是否具有性能优势?

我不明白为什么上面的链接中的这个答案被投票,为什么这个答案被拒绝。

就像我说的一样。

您也可以在这里看看

PHP,单引号或双引号中更快的是什么?

评论


-1用于过早的优化。除非您在一个脚本中打印数百万次,否则性能的差异不足以成为一个因素-即便如此,您执行的任何其他处理也会使您可能花费一种方式而不是另一种方式打印的额外几秒钟相形见war 。它们之间的主要区别是可读性(这使我更喜欢第二种样式)。

– cHao
2011年4月9日18:39



我可以尝试回答您的最后一个问题。 PHP社区中有很多谣言,其中有些非常强烈。公开它们很费力,而且要花时间。但是它正在慢慢改变。因此,您所链接的答案是旧的,从人们不在乎的时代开始。在这篇文章中,有些人是根据自己的经验回答的,而不是根据他们阅读的某些文章回答的。

–您的常识
2011-4-10 12:26



性能损失为+1 @cHao。这是一篇带有指标证明的文章。 nikic.github.io/2012/01/09/…

–大面
16年5月11日在1:15



#12 楼

如果要执行SQL命令,并且变量是数组成员,则不应在数组[]内使用单引号(例如:['']);例如,如果将此字符串用作SQL命令,则会得到server error 500

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)


正确的字符串是:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";


评论


您应该改用PDO

– s3c
3月30日10:28

#13 楼

我使用点(。)连接字符串和变量。像这样-
echo "Hello ".$var;

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


#14 楼

我知道这是一个老问题,但是我认为有人必须提一下所有利弊:

更好的语法:这是个人喜好。

性能:没什么区别。如许多人所述,如果使用不切实际的变量,则双引号可能会更快。

更好的用法:单引号(大多数情况下)。正如@Khez所说,您可以使用单引号将任何内容连接起来,甚至包括函数调用和变量修改,例如:echo 'hi ' . trim($name) . ($i + 1);。双引号唯一不能做的事就是使用\n\r\t等。

可读性:没什么区别(可能适用个人喜好)。

可写性/可重写性/调试:在1行语句中没有区别,但是当处理多行时,在调试或编写时注释/取消注释行会更容易。例如:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';


少转义:单引号。对于单引号,您只需要转义2个字符('\)。对于双引号,您需要转义2个字符("\),如果需要则另转3个字符(${})。

较少更改:单引号。例如,如果您具有以下代码:

echo 'Number ' . $i . '!';


并且您需要将1递增到$ i,它就变成这样:

echo 'Number ' . ($i + 1) . '!';


但是要双引号,您需要更改以下内容:

echo "Number $i!";


更改为:

echo "Number " . ($i + 1) . "!";



结论:使用您喜欢的内容。