在字符串中的美元符号后使用花括号是否是错误的

时间:2019-02-24 23:16:14

标签: php

我试图了解复杂变量语法中两种可能的语法变化之间的区别是什么。 PHP允许两种变体:

$foo = 'bar';
$bar = "${foo}bar is allowed"; //or
$bar = "{$foo}bar is allowed";

使用任何一种语法均不会生成错误/警告/通知。我注意到两者之间没有区别,但是PHP manual仅显示了{$foo}变体。
使用其他变体是错误的吗?会不会给我带来任何问题?

2 个答案:

答案 0 :(得分:5)

在几乎所有情况下,似乎PHP都能扩展两种格式以引用正确的值。

我唯一能找到的就是访问对象属性时,例如

$foo = (object) ['a' => 'bar'];
echo "{$foo->a}bar"; // barbar
echo "${foo->a}bar"; // Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)

因此,我会避免使用${...}

有关PHP字符串的更多参考资料,另请参见Curly braces in string in PHP

答案 1 :(得分:3)

${...}是用于其他目的的语法。它用于间接引用变量名。如果不使用字符串插值,则花括号或方括号中的文字名称将作为字符串文字写入,因此用引号引起来。但是,内插引号花括号:

$bar = 'baz';

echo $bar , PHP_EOL;
echo ${'bar'} , PHP_EOL;

$arr = ['a' => 1, 'b' => ['x' => 'The X marks the point.']];
echo $arr['a'] , PHP_EOL;

// interpolation:
echo "$arr[a] / {$arr['a']}" , PHP_EOL;

您还可以使用函数代替文字:

function foo(){return "bar";}

// Here we use the function return value as variable name.
// We need braces since without them the variable `$foo` would be expected
// to contain a callable

echo ${foo()} , PHP_EOL;

插值时,仅当表达式不明确时,才需要将花括号括起来:

echo "$arr[b][x]", PHP_EOL;       // "Array[x]"     
echo "{$arr['b']['x']}", PHP_EOL; // "The X marks the point."

现在,我们了解到${...}是一个简单的“无括号”插值,类似于"$arr[a]",因为花括号仅用于间接变量名称引用。我们仍然可以将其括在花括号中。

内插函数调用形成变量名:

echo "${foo()} / {${foo()}}", PHP_EOL;
// "baz / baz" since foo() returns 'bar' and $bar contains 'baz'.

同样,"${bar}"相当于${'bar'},用大括号"{${'bar'}}"


如评论中所述,

还有另一种大括号语法可以引用数组键。

$someIdentifier{'key'}

这只是PHP通用数组语法$array['key']的替代语法。

与后者相反,在间接变量名称引用上,花括号紧跟在$或对象成员运算符->之后。为了使它更加神秘,我们可以将两者结合起来:

$bar['baz'] = 'array item';
echo ${'ba' . 'r'}{'ba'.'z'};

等效于echo $bar['baz'];

PHP字符串插值真的很奇怪:"${bar}"是有效的,"${'bar'}"也是有效的,但不是"$array['key']""$array[key]"是有效的,但是"$array{key}"都有效和"$array{'key'}",根本不起作用。

结论

应该习惯于一直使用大括号内插语法。完全不应该使用大括号数组键语法。
始终使用:

"{$varname} {$array['key']} {${funcname().'_array'}['key']}"

另请参见PHP文档:

(与众不同)

  • Variable variables(也称为间接变量名称引用)

  • Accessing array elements

      

    方括号和花括号都可以互换地用于访问数组元素(例如,在上面的示例中,$ array [42]和$ array {42}都将执行相同的操作)。