我应该在字符串中使用花括号还是连接变量?

55

在字符串中连接变量和使用花括号的方式相比,有什么优势或劣势吗?

使用连接符的方式:

$greeting = "Welcome, " . $name . "!";

花括号:

$greeting = "Welcome, {$name}!";

就我个人而言,我总是将我的字符串拼接在一起,因为我使用UEStudio,当我将PHP变量连接在一起时,它会用不同的颜色突出显示。然而,当变量没有分开时,就不会这样。长字符串中查找PHP变量变得更加容易。

有些人把这个问题和SQL混淆了。这不是关于SQL的问题。我已经更新了我的示例以避免混淆。


1
这是太多重复问题的副本,包括https://dev59.com/J0jSa4cB1Zd3GeqPKP-Y(这更像是单引号与双引号的问题,但花括号只能在双引号字符串中使用) - BoltClock
是的,我似乎是唯一一个意识到你的问题不是关于 SQL 的人(所以我说“离题了”)。 - BoltClock
1
PhpStorm 正确地将引号中的变量分开突出显示。 - nawfal
3个回答

59

如果查看输出,以下所有内容都是相同的。

  1. $greeting = "欢迎," . $name . "!";
  2. $greeting = '欢迎,' . $name . '!';
  3. $greeting = "欢迎,$name!";
  4. $greeting = "欢迎,{$name}!";

您不应使用选项1,而应改用选项2。选项3和4相同。对于简单的变量,大括号是可选的。但是,如果使用数组元素,则必须使用大括号;例如:$greeting = "欢迎,{$user['name']}!";因此,作为标准,如果使用变量插值,应使用花括号而不是连接符。

但是,如果使用诸如制表符(\t)、换行符(\n)等字符,则它们必须在双引号内。

通常,变量插值较慢,但如果要连接太多变量,则连接可能也较慢。因此,根据其中有多少变量以及其他字符来决定选择哪种方式。


6
真的啊。@mririgo 单引号微优化神话已经被驳斥得十分彻底。除非你有一个包含数百万个字符串的2GB PHP脚本,否则你将无法测量它,因为这仅存在于标记器中。使用xdebug并找到真正需要优化的内容。 - mario
1
当我们为并发访问开发网站时,必须尽可能地优化编码/网页。 - Amil Waduwawara
6
对于数组元素,花括号不是必需的,只需去掉单引号:$greeting = "欢迎,$user[name]"; 这是唯一一次 $user[name] 不会产生提示。 - Luke
1
http://www.php.net/manual/zh/language.types.string.php 上说您不需要用花括号包装数组元素。 - Popnoodles
关于3和4,3更易读,但4更明确。3更短,但4会给你更一致的风格。最终这是个人偏好。我喜欢语法糖,所以我喜欢3。 - nawfal
显示剩余3条评论

3

使用预编译的PHP(字节码缓存),这没有任何区别。

此功能随PHP 5.5(Zend Optimizer+)一起提供。


3
尽管没有处理注入攻击(包括SQLi),但至少应该注意一下——尤其是对于PHP开发人员——在不先编码和验证所有输入的情况下使用上述任何技术都会导致注入攻击。
在编码开始时记住安全性很重要,而不是在最后需要重新编写所有代码以符合安全要求时。或者,当你最终解决了那个“ vs.'”战争并意识到,如果不正确地编码和验证所有输入,你将容易受到XSS攻击,而这两种技术都可能受到攻击。
  1. 使用urlencode()htmlenities()编码来规范输入。
  2. 对于非字符串使用数据类型或对于字符串使用字典查找和/或正则表达式进行验证
  3. 利润?

5
urlencode()和htmlentities()不应用于规范化输入。相反,在输出到浏览器之前,应将它们用于包含HTML、JS或CSS的用户输入数据。 - dotancohen
1
如果你在做SQL,一定要使用预处理语句。即使是最好意的字符串过滤器也已经被各种攻击彻底击败。预处理语句可以清晰地分离逻辑和数据,提供更高效的数据插入和检索,并且安全性已经由数据库领域的专家进行了审查。或者,使用一个经历过实战考验的ORM(最好是数据映射类型而不是活动记录类型,如果你重视性能和类型安全)。 - Shayne

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