PHP运算符 - > {...}是什么意思?

WeS*_*See 14 php operators

我最近在PHP代码中看到了这一行:

$dbObject = json_decode($jsonString);
$dbObject->{'mysql-5.4'}[0]->credentials
Run Code Online (Sandbox Code Playgroud)

这是什么意思?在PHP文档中我们可以阅读,那

方括号和花括号可以互换使用来访问数组元素(例如$ array [42]和$ array {42}在上面的例子中都会做同样的事情).

但是如何定义Object $ dbObject以允许->{...}[...]访问?这段代码有点不安全吗?哪个PHP版本允许这个?

我错过了PHP文档中的任何内容吗?

dec*_*eze 22

这是为了能够访问属于无效语法的属性作为裸文字.含义:

$dbObject->mysql-5.4[0]->credentials
Run Code Online (Sandbox Code Playgroud)

这是无效/模糊的语法.要明确PHP mysql-5.4是属性而不是属性减去浮点数,您需要使用{'..'}语法.

确切地说,->{..}使您可以使用任何表达式作为属性名称.例如:

$dbObject->{ sprintf('%s-%.1f', 'mysql', 5.4) }
Run Code Online (Sandbox Code Playgroud)


Sim*_*mba 5

大括号语法允许您使用字符串文字或变量作为属性或方法名称。

这很有用,原因如下:

  1. (根据 @Deceze 的回答):它允许您访问否则不是有效 PHP 语法的属性名称 - 例如,根据您的示例,如果属性名称包含点或破折号。通常,这样的属性可以通过魔术方法访问__get(),因为它们也是定义为类中实际属性的无效语法。

  2. (根据 @feela 的回答):它允许您使用变量来引用您的属性。这类似于$$变量变量语法。这通常不是很好的做法,但在某些情况下很有用。

  3. (尚未被任何其他答案提及):它允许您从代码中删除某些潜在的歧义。例如,考虑以下代码:

    $output = $foo->$bar['baz'];
    
    Run Code Online (Sandbox Code Playgroud)

    这是模棱两可的。您可以通过添加大括号或方括号来解决歧义:

    $output = $foo->{$bar['baz']};  //gets the value of a property from $foo which has a name that is defined in $bar['baz']
    $output = ($foo->$bar)['baz'];  //gets the ['baz'] element of $foo->$bar array.
    
    Run Code Online (Sandbox Code Playgroud)

    这一点特别重要,因为即将发布的 PHP 7 将改变类似代码的默认行为。这将使语言的行为更加一致,但会破坏没有大括号的现有代码。

    另请参阅此处有关此更改的 PHP 文档:https://wiki.php.net/rfc/uniform_variable_syntax

    但即使没有语言改变来强制解决这个问题,像这样的代码无论如何都应该有大括号以帮助提高可读性——如果你不加大括号,那么你最终可能会很难弄清楚你来时想要做什么六个月后回到代码。