我试图了解复杂变量语法中两种可能的语法变化之间的区别是什么。 PHP允许两种变体:
$foo = 'bar';
$bar = "${foo}bar is allowed"; //or
$bar = "{$foo}bar is allowed";
使用任何一种语法均不会生成错误/警告/通知。我注意到两者之间没有区别,但是PHP manual仅显示了{$foo}
变体。
使用其他变体是错误的吗?会不会给我带来任何问题?
答案 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']}"
(与众不同)
Variable variables(也称为间接变量名称引用)
方括号和花括号都可以互换地用于访问数组元素(例如,在上面的示例中,$ array [42]和$ array {42}都将执行相同的操作)。