【问题标题】:In PHP, what does the ${$ } syntax do?在 PHP 中,${$} 语法有什么作用?
【发布时间】:2013-08-21 20:23:05
【问题描述】:

我在 WordPress 插件中遇到了这个问题。

$stuff = $wpdb->get_results(" assume valid database query here ");
foreach ($stuff as $cur)
    ${$cur->type}[] = $cur->name;

$stuff 将是一个包含更多数据库行对象的对象。这些数据库行将包含'id''type''name' 列。 'type' 列将包含以下三个字符串之一:'file''url''code'

看起来这段代码 sn-p 可能会创建或添加新元素到名为 $file$url 和/或 $code 的数组中。但是,我不熟悉 ${$ } 语法的这种用法。我只在双引号字符串中看到它以避免解析问题。

我对这段代码的分析是否正确?在哪里可以了解有关 ${$ } 语法的这种用法的更多信息?

双引号字符串中有一个question about the ${ } syntax。我理解这种用法​​,但我特意询问 { } 大括号内的第二个 $ 字符。

【问题讨论】:

  • {$cur->type} 强制此位首先解析,确保$$cur 不是意思,$cur->type[] 也不是。如果您想了解更多有关整体方法的信息,请查看variable variables - 这是一种编写变量名称本身可能会更改的表达式的方法。
  • @j08691:那个副本实际上是关于不同的东西。不完全不同,但不是这里的情况。
  • @Ben - 如果这个问题作为 j08691 提出的项目的副本而关闭,请联系我,我会投票重新开放。这提到了{},但没有提到$$
  • @halfer,它被标记为重复。我有我的答案,但如果你想重新打开,请随意。这不是那个问题的重复。如果有的话,它是 this one 的副本。

标签: php syntax


【解决方案1】:

考虑

$foo = 42;
$a = 'foo';
echo $$a; // Prints 42

这称为变量变量,因为变量的名称是在运行时确定的。 但是 $$a[1] 是和 ${$a[1]} 一样还是和 {$$a}[1] 一样?括号避免了这种歧义,就像它们在处理数学中的运算符优先级时所做的那样。

【讨论】:

    【解决方案2】:

    这是一个“变量”。在这种情况下,它指的是名为 $cur->type 的变量中的数组。

    我个人讨厌这样,并且更愿意这样做:

    $someArray[$cur->type][] = $cur->name;
    

    【讨论】:

    • 不,变量变量是 PHP 中的其他东西。这就是开头$$ 的东西:php.net/manual/en/language.variables.variable.php
    • @hakre 在这种情况下它是变量变量,但持有最终变量名称的是复杂形式。
    • @dev-null-dweller:我不这么认为。属性访问不仅仅是一个变量,它是变量变量中的第二个。我会说这更像String Parsing 然后像Variable Variables
    • 嗯,这个例子确实是在变量变量页面上,我的立场是正确的:“也可以使用花括号来明确分隔属性名称。它们在访问内部值时最有用包含数组的属性,当属性名称由多个部分组成时,或者当属性名称包含无效的字符时(例如来自 json_decode() 或 SimpleXML)。” - 至少两者都是正确的,手册也在我喜欢的字符串页面上称之为复杂(卷曲)语法。只是可能没有记录它的中心位置。
    【解决方案3】:

    这些花括号打开一个字符串上下文,将表达式中的表达式计算为一个字符串,然后将其用作变量名。

    例如,如果你想写一个你永远无法用普通 PHP 写的名字的变量:

    echo $;
    

    名称为空的变量。 PHP 会给你一个语法错误。但是,您可以使用大括号创建此类变量:

    ${''} = 'hello';
    echo ${''}; # prints "hello"
    

    这是一个名称为空的变量。如果您想先评估变量名,这会很有帮助:

    ${$cur->type}[]
    | ### 1. ###|
    `---- 2. ---´
    

    这使您可以清楚地说明数组的位置。在$cur->type 命名的变量中命名

    我可能无法很好地解释它,这是我记得的一篇博文,所以它可能值得讨论这个话题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2012-09-09
      • 2011-11-14
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多