2014-09-30 70 views
7
$name = "jason"; 
$p = "hello-{hello2}-$name-{$name}"; 
echo $p; 

输出:{}在字符串中做什么?

hello-{hello2}-jason-jason 

碰到预处理语句的一些例子,注意到这一点。如果它包含一个变量,它会将其删除,否则它会保留它们。为什么这种行为在必要时

echo "$name"; 

让你得到相同的结果

echo "{$name}"; 

或只是可读性?

+2

它用于从字符串中分离变量,例如'echo“我喜欢{$ str} s很多”; '使用{}语法无法做到这一点。 – BojanT 2014-09-30 15:09:28

+0

请注意:如果您在_“准备好的声明”中遇到过_,那么很可能他们并不是真正准备好的声明。 – Wrikken 2014-09-30 15:18:58

回答

12

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

例如

$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' 
+0

第二次打我,很好。 – Dexa 2014-09-30 15:11:14

+0

echo“你好,{$ foo ['bar'] ['baz']}”;轰隆去炸药!有道理,我可以看到他们为什么现在这样做。您赢得了提供代码示例的绿色复选标记。谢谢! – jason 2014-09-30 15:16:52

+0

刚刚意识到你有200k的声望。我一直在寻找有人问:你觉得你知道关于PHP的一切吗?我一直在研究它很长一段时间,它似乎压倒性的,知道的东西的数量,'陷阱',微妙。你记住函数,参数还是你仍然查找很多东西?我必须看到几乎所有东西。我知道x可以完成,但并不总是确切地说哪个对象/函数的组合最适合这样做。另外,你写更多的程序或代码?我约50/50。无论如何,再次感谢您回答我的原始问题。 – jason 2014-09-30 15:35:43

4

这是一种叫做“复杂的语法”

php.net你可以去复合物(花)语法部分,看到很多例子。

复合物(花)语法

这不叫复杂,因为语法复杂,而是因为它允许使用复杂表达式。

任何具有字符串表示形式的标量变量,数组元素或对象属性均可通过此语法包含在内。简单地写出表达式的方式与字符串外部的方式相同,然后将其包装在{和}中。由于{不能被转义,这个语法只有在$紧跟在{之后才能被识别。使用{\ $获取文字{$。

函数,方法调用,静态类变量和内部自PHP 5. {$}工作类常量然而,访问的值将被解释为在范围的变量,其中该字符串被定义的名称。使用单个大括号({})将无法访问函数或方法的返回值或类常量或静态类变量的值。

1

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

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

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

输出

Output1: bar 
Output2: foos 

您也可以通过卷曲语法访问复杂的结构,如{$foo->bar}

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 />"; 

,同时也解决了这个问题,但如果你在字符串有很多这样的变量,这将是更方便使用大括号。

相关问题