{}在字符串中做了什么?

时间:2014-09-30 15:05:32

标签: php

$name = "jason";
$p = "hello-{hello2}-$name-{$name}";
echo $p;

输出:

hello-{hello2}-jason-jason

遇到了一些准备好的陈述的例子并注意到了这一点。如果它包含一个变量,它将删除它们,否则它会保留它们。

时为什么需要这种行为?
echo "$name";

获得与

相同的结果
echo "{$name}";

还是只是可读性?

4 个答案:

答案 0 :(得分:12)

它用作字符串中变量的分隔符。在某些情况下这是必要的,因为PHP的字符串解析器不是贪婪的,并且会错误地解释许多常见的结构。

e.g。

$foo = array();
$foo['bar'] = array();
$foo['bar']['baz'] = 'qux';

echo "Hello $foo[bar][baz]";

实际上会打印

Hello Array[baz]

因为它被解析为

echo "Hello ", $foo['bar'], "[baz]";
        ^          ^           ^
      string     array       string

使用{}强制PHP将数组引用视为单个实体:

echo "Hello, {$foo['bar']['baz']}";  // prints "Hello, qux"

它还有助于区分模棱两可的东西

$foo = 'bar';

echo "$foos" // undefined variable 'foos'
echo "{$foo}s" // variable containing 'bar' + string 's'

答案 1 :(得分:4)

它被称为"复杂语法"

php.net开始,您可以转到复杂(卷曲)语法部分,并查看许多示例。

  

复杂(卷曲)语法

     

这不称为复杂,因为语法很复杂,但因为它允许使用复杂的表达式。

     

可以通过此语法包含任何具有字符串表示形式的标量变量,数组元素或对象属性。只需以与字符串外部相同的方式编写表达式,然后将其包装在{和}中。由于{无法转义,因此仅当$紧跟{时,才会识别此语法。使用{\ $获取文字{$。

     

自PHP 5起,{$}内的函数,方法调用,静态类变量和类常量工作。但是,访问的值将被解释为定义字符串的作用域中变量的名称。使用单个花括号({})将无法访问函数或方法的返回值或类常量或静态类变量的值。

答案 2 :(得分:1)

它不一定产生相同的输出:

$name = 'foo';
$names = 'bar';

echo "Output1: $names";
echo "Output2: {$name}s";

输出

Output1: bar
Output2: foos

此外,您还可以通过{$foo->bar}等语法提供复杂的结构。

答案 3 :(得分:0)

当您想要在某些字符串后面显示变量并且您不希望它们之间有任何空格时,此语法非常有用。

比较以下内容:

<?php

$name='John';

echo "My name is $nameathan. I'm twenty years old<br />";
echo "My name is {$name}athan. I'm twenty years old<br />";

它会给你结果:

Notice: Undefined variable: nameathan in ... on line 5
My name is . I'm twenty years old
My name is Johnathan. I'm twenty years old

对于第一个回声,它会产生通知并且不会按预期工作,因为PHP不知道你想在字符串中使用变量$name而不是$nameathan。在第二种情况下使用花括号解决了这个问题。

当然你可以用这种方式连接字符串:

echo "My name is $name"."athan. I'm twenty years old<br />";

并且它也解决了这个问题,但是如果你在字符串中有很多这样的变量,那么使用花括号会更方便。