代码之家  ›  专栏  ›  技术社区  ›  Dharman vijay

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

php
  •  1
  • Dharman vijay  · 技术社区  · 7 年前

    PHP允许两种变体:

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

    PHP manual 只显示 {$foo} 变体。

    1 回复  |  直到 7 年前
        1
  •  10
  •   Pinke Helga    7 年前

    ${...} 是另一个用途的语法。它用于间接引用变量名。如果没有字符串内插,大括号或方括号中的文字名称将被写为字符串文字,因此用引号括起来。但是,内插引号是 不 习惯于 大括号:

    $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'}" "$array['key']" , "$array[key]" 是有效的,但两者都是, "$array{key}" 和 "$array{'key'}"

    应该养成一直使用大括号内插语法的习惯。应该完全避免使用大括号数组键语法。
    始终使用:

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

    (区别于)

        2
  •  5
  •   Phil    7 年前

    所有案例。

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

    所以考虑到这一点,我会避免使用 ${...}

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

    推荐文章