单引号或双引号用于变量拼接?

26

将变量(例如$name)连接到现有字符串(例如$string)中,哪种方式更好:

$string='Hi, my name is '.$name
或者像这样将变量嵌入字符串中:
$string="Hi, my name is $name";

还是使用像这样的函数更好:

$string=sprintf("Hi, my name is %s",$name);

在处理器时间/效率方面,哪个更好?


我会说,这取决于数据来自哪里...用户输入还是系统输入。 - Prix
会有性能差异吗?比如,每个会使用更多的处理器时间吗? - ina
1
/me 向 SitePoint 的名人 Dan Grossman 挥手。 - ina
也许这取决于你使用的系统?在我几年前发布这篇文章时,单引号在我使用的x86旧服务器上速度更快。 - ina
10个回答

27

所有做过测试的人都得出结论:在性能方面,使用单引号略优于双引号。因为单引号只是个连接操作,而双引号则会强制解析字符串中的变量。

然而,对于PHP的最新版本来说,这种额外负担如此之小,以至于大多数时间并不重要。

所以对于追求性能的人:使用单引号。对于“我喜欢我的代码易读”的人:双引号更易于阅读,就像Flavius Stef已经指出的那样。

编辑:但是有一件事 - 如果您要在字符串中使用一个未定义的变量,务必使用单引号! (http://www.weberdev.com/get_example-3750.html 指出解析这些字符串将需要4倍的时间)


8
“everyone who did the test...” 数据来源是什么? - ina
2
这里有两个相关编程的链接,分别是:http://classyllama.com/development/php/php-single-vs-double-quotes/ 和 http://www.procata.com/blog/archives/2005/03/08/microbenchmarks-of-single-and-double-qouting/。当然,谷歌上还有很多类似的内容。 - Blizz
我认为测试甚至不是必需的。这只涉及到处理器指令的数量。你拥有的指令越少(在这种情况下可以轻松猜测),你就越快。 - snowflake
2
如果以前有任何相关的性能原因,现在已经没有区别了- http://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html - user2864740
2
兄弟,你认真的吗?你不仅回复了一个超过6年的答案,而且基本上说了完全相同的话。这就是“稍微好一点”的意思:“非常轻微”。 - Blizz
显示剩余4条评论

14

在PHP中,单引号和双引号的区别在于,双引号是"智能"的,即在读取时会解析变量,而单引号是"愚蠢"的,并不会尝试解析字符串中的任何字符。

这导致了一些细微差别,例如使用单引号时你只需要转义单引号本身:

'\''

如果您使用双引号,则必须转义其他字符:

"\$"

但它还可以实现一些巧妙的功能,比如在末尾添加换行符:

"my string\n"

如果使用单引号,您需要进行字符串拼接:

'my string' . chr(10)
'my string' . "\n"

一般来说,单引号之所以更快是因为它们比较“愚蠢”。

然而,通常情况下,我们不需要过于担心这些问题,这叫做过早优化,应该避免。

关于优化的几点建议:一般来说,应该先编写程序,让其正常运行,然后找出最大的瓶颈并解决它们。如果在PHP中,字符串速度真的是一个问题,您可能需要考虑切换到另一种语言。

关于速度:你可能更想关注内存使用而不是CPU时间。在这些情况下,CPU时间可以被认为是相当恒定的。当编写要迭代多次的算法时,CPU时间更加相关。

关于连接字符串:使用点运算符连接字符串的次数越多,使用的内存就越多。

请考虑以下内容:

$str1 = 'asdf';
$str2 = 'qwer';

// this will result in more memory being allocated for temporary storage
echo $str1 . $str2;

// this will not allocate as much memory as the previous example
echo $str1;
echo $str2;

2
另一种方式:echo $str1, $str2; - alexia

9

我一般认为使用字符串插值("Hi, my name is $name")从可读性的角度来看更好。


6
为了提升性能,正如其他人已经证明的那样,使用单引号比双引号略快一些。
如果将单引号应用于可读性科学,并远离主观性,实际上会增加更多的“噪音”。《代码整洁之道》一书中谈到了噪音及其与可读性的关系,可以得出这样一个结论:您需要查看的非空格内容越多,它就越阻碍可读性。如果将其应用于主观性,则我读过的大多数地方实际上都喜欢单引号而不是双引号。
请自行判断。
$var = "My $string with $lots of $replacements."

比起这样写:

更容易阅读。
$var = 'My ' . $string . ' with ' . $lots . ' of ' . $replacements . '.';

我承认:

$var = "My string.";

看起来与以下内容几乎相同:

$var = 'My String.';

然而,后者引入的噪音较少,并且当周围有大量代码时,每一点都有帮助,更不用说使用单引号带来的其他好处了。
最终,我倾向于简单易行。除非需要双引号,否则请使用单引号。这是一个简单的约定,更易于输入、维护、解析和阅读。

0

就我个人而言,如果只是一个普通变量,甚至是一个类属性,我会这样写:

$newVarA = "This is some text with a $variable";
$newVarB = "This is some more text, written in $settings->language";

然而,如果我使用数组值,那么我将使用单引号进行连接。

$newVarC = 'This is some text from a ' . $text['random'] . ' array';

希望这个有意义。它关乎于找到惯例并坚持它。


你的数组示例在没有连接的情况下完全正常。可以使用... from a {$text['random']} array或者... from a $text[random] array。只有当你引用多维数组时,才必须使用{}方法,因为PHP解析器不会贪心。$array[x][y]将被解析为<contents of $array[x]><plain text [y]> - Marc B
是的。但我觉得在字符串中使用大括号有点丑陋。就像我说的,这只是我个人如何将变量与字符串连接的一个例子。 - Martin Bean

0

从语法角度来看,两种变体都是正确的。使用你感觉更舒适的那个。

就我个人而言,当使用$string="Hi, my name is $name"时,我感觉更好,因为你不需要操心引号的问题。想象一下带有10个变量的复杂SQL查询...


0

0

0

我的座右铭和答案是:把编写机器代码的任务留给编译器。我将告诉你我的意思...

在不需要包含 PHP 变量时,请使用单引号,否则请使用双引号。 不要担心性能问题,只需在生产服务器上使用 APC。相反,专注于编写最易维护的代码;适当地使用注释、双引号等,即使它们可能会减慢代码速度。任何降低代码可维护性/可读性的优化都是有害的,把这些任务留给操作码缓存器和编译器来将您的代码转换为机器代码,不要自作聪明...因为优化而混淆您的源代码会招致反效果。


-5
$string='Hi, my name is '.$name

这是最好的方式,从php和html的结合角度来看!

或者像这样:

$string="Hi, my name is $name";

这是旧方法!

或者像这样:

$string=sprintf("Hi, my name is %s",$name);

这是来自Visual Basic或其他客户端编程语言的程序员写的代码!
我希望我对你有所帮助。

1
我不同意"Hi, my name is $name"是“老旧的”,而且认为'Hi, my name is '.$name更好的说法! - Josh

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