我试图理解复杂变量语法中两种可能的语法变体之间的区别.PHP允许两种变体:
$foo = 'bar';
$bar = "${foo}bar is allowed"; //or
$bar = "{$foo}bar is allowed";
Run Code Online (Sandbox Code Playgroud)
使用任一语法时都不会生成错误/警告/通知.我注意到两者没有区别,但是PHP手册只显示了{$foo}变体.
使用其他变体是错误的吗?它会不会给我带来任何问题?
Qua*_*one 10
${...}是另一种用途的语法。它用于间接引用变量名。如果没有字符串插值,花括号或方括号中的文字名称将写为字符串文字,因此用引号括起来。但是,在花括号外不使用内插引号:
$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;
Run Code Online (Sandbox Code Playgroud)
除了文字,您还可以使用函数:
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;
Run Code Online (Sandbox Code Playgroud)
插值时,仅当表达式不明确时才需要将其括在花括号中:
echo "$arr[b][x]", PHP_EOL; // "Array[x]"
echo "{$arr['b']['x']}", PHP_EOL; // "The X marks the point."
Run Code Online (Sandbox Code Playgroud)
现在我们明白这${...}是一个简单的插值“没有大括号”,类似于"$arr[a]"因为大括号仅用于间接变量名称引用。不过,我们可以将其括在花括号中。
形成变量名称的内插函数调用:
echo "${foo()} / {${foo()}}", PHP_EOL;
// "baz / baz" since foo() returns 'bar' and $bar contains 'baz'.
Run Code Online (Sandbox Code Playgroud)
同样,"${bar}"等价于${'bar'}, 在花括号中:"{${'bar'}}"。
还有另一种花括号语法来引用数组键。
$someIdentifier{'key'}
Run Code Online (Sandbox Code Playgroud)
这只是 PHP 通用数组语法的一种替代语法$array['key']。
与后者相反,在间接变量名称引用上,花括号紧跟在$or 对象成员 operator 之后->。为了使它更加神秘,我们可以将两者结合起来:
$bar['baz'] = 'array item';
echo ${'ba' . 'r'}{'ba'.'z'};
Run Code Online (Sandbox Code Playgroud)
这相当于 echo $bar['baz'];
PHP 的字符串插值真的很奇怪:"${bar}"is valid and "${'bar'}" as well but not "$array['key']","$array[key]"是有效的,但是,"$array{key}"and "$array{'key'}",根本不起作用。
应该养成一直使用花括号插值语法的习惯。应该完全避免花括号数组键语法。
始终使用:
"{$varname} {$array['key']} {${funcname().'_array'}['key']}"
Run Code Online (Sandbox Code Playgroud)
(区分)
似乎PHP能够扩展任一格式以在几乎所有情况下引用正确的值.
我能找到的唯一区别是访问对象属性时,例如
$foo = (object) ['a' => 'bar'];
echo "{$foo->a}bar"; // barbar
echo "${foo->a}bar"; // Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)
Run Code Online (Sandbox Code Playgroud)
所以考虑到这一点,我会避免使用${...}.
有关PHP字符串的更多参考资料,另请参阅PHP中的字符串中的Curly大括号.