【问题标题】:Should I use curly brackets or concatenate variables within strings?我应该在字符串中使用大括号还是连接变量?
【发布时间】:2011-06-08 06:22:15
【问题描述】:

在字符串中连接变量或使用花括号是否有优点或缺点?

级联:

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

花括号:

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

就我个人而言,我总是连接我的字符串,因为我使用UEStudio,它会在连接时以不同的颜色突出显示 PHP 变量。但是,当变量没有被打破时,它不会。它只是让我的眼睛更容易在长字符串等中找到 PHP 变量。

人们对 SQL 感到困惑。这是 不是 这个问题是关于什么的。我已经更新了我的示例以避免混淆。

【问题讨论】:

  • 重复的问题太多了,包括stackoverflow.com/questions/1311368/…(这更像是一个单引号和双引号的问题,但无论如何,花括号只能在双引号字符串中使用)
  • 是的,我似乎是这里唯一一个意识到您的问题并非专门针对 SQL 的人(因此我说“离题”)。
  • PhpStorm 正确地高亮分别用引号括起来的变量。

标签: php concatenation curly-braces


【解决方案1】:

如果您查看输出,则以下所有操作都相同。

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

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

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

通常变量插值很慢,但如果要连接的变量太多,连接也可能会更慢。因此,根据其他字符中有多少变量来决定。

【讨论】:

  • 感谢您的详细解释。我相信我会继续连接花括号。
  • Boah,真的。 @mririgo 单引号微优化神话已经彻底debunked。除非您有一个包含数百万个字符串的 2GB php 脚本,否则您将无法测量它——因为它仅存在于标记器中。使用 xdebug 并找到真正需要优化的东西。
  • 在开发并发访问的网站时,要尽可能优化编码/网页。
  • 数组元素不需要大括号。只需去掉单引号: $greeting = "Welcome, $user[name]";这是 $user[name] 唯一一次不会导致通知。
  • php.net/manual/en/language.types.string.php 说你不用花括号来包裹数组元素
【解决方案2】:

虽然不处理注入攻击(包括 SQLi),但至少应该注意 - 特别是对于 PHP 开发人员 - 在没有首先编码和验证所有输入的情况下使用上述任何技术都会引导您进行基于注入的攻击。

在编码开始时记住安全性很重要,而不是结束时需要重做所有代码以符合安全要求。或者,当你最终结束这场“与”战争时,意识到这并不重要,因为在没有正确编码和验证所有输入的情况下,使用这两种技术都容易受到 XSS 的影响。

  1. 编码使用 urlencode()htmlenities() 来规范化输入。
  2. 对非字符串使用数据类型OR字典查找和/或字符串的正则表达式以验证
  3. 利润?

【讨论】:

  • urlencode() 和 htmlenities() 不应用于规范化输入。相反,它们应该在将用户输入的数据输出到浏览器之前使用,这些数据不应包含 HTML、JS 或 CSS。
  • 如果您使用 SQL,总是 使用准备好的语句。随着时间的推移,即使是最善意的字符串消毒剂也被各种攻击彻底击垮。准备好的语句将逻辑与数据清晰地分离,提供更高效的数据插入和检索,并且安全性已受到数据库领域专家的审查。或者使用久经考验的 ORM(如果您重视性能和类型安全,最好使用数据映射而不是活动记录种类)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多