何时在变量周围加花括号

49

我不知道该如何解释这个问题,但通俗易懂地说,我看到有些人在输出数值时使用{$variable}。我注意到{$variable}并不是万能的。我们什么时候应该使用{$variable}呢?


2
这不是纯 PHP,可能是 PHP 框架语法,例如 Laravel 5 中的 Blade 模板引擎使用 {{$variable}} 来输出内容。 - Asur
12
@asur那是不正确的。这被称为复杂(花括号)语法 - Francesco de Guytenaere
2
可能是[PHP语法中${}]的重复问题。(https://dev59.com/eG035IYBdhLWcg3wMM8G) - Francesco de Guytenaere
2
@Ciccio确实,但我认为他的意思是花括号单独存在,而不是在print语句中。 - Asur
"$var['key']"怎么样?似乎不用花括号也能工作,但是有什么建议吗? - user9645
3个回答

95

什么是 PHP 大括号:

您知道字符串可以通过四种不同的方式指定。其中两种方法是双引号("")和heredoc语法。你可以在这两种类型的字符串中定义变量,PHP解释器也会解析或解释这些变量。

现在,您可以使用两种方法在字符串中定义变量——简单语法和复杂语法。后者使用大括号来定义变量。

大括号语法:

使用大括号表示一个变量非常容易。只需要用 { 和 } 包裹变量名即可:

{$variable_name}

注意: { 和 $ 之间不能有空格。否则,PHP解释器不会将 $ 后面的字符串视为变量。

大括号示例:

<?php
$lang = "PHP";
echo "You are learning to use curly braces in {$lang}.";
?>

输出:

You are learning to use curly braces in PHP.

何时使用花括号:

当您在字符串内定义一个变量时,如果使用简单的语法定义变量,PHP可能会将变量与其他字符混淆,从而导致错误。请参见下面的示例:

<?php
$var = "way";
echo "Two $vars to defining variable in a string.";
?>

输出:

Notice: Undefined variable: vars 
在上面的示例中,PHP解释器将$vars视为变量,但实际上应该是$var。为了将变量名与字符串中的其他字符分开,可以使用花括号。现在,看一下使用花括号的上面的示例-
<?php
$var = "way";
echo "Two {$var}s to define a variable in a string.";
?>

输出:

Two ways to define a variable in a string.

来源: http://schoolsofweb.com/php-curly-braces-how-and-when-to-use-it/


9
它也适用于类的属性和方法。 "this is a {$class->prop}" and it is {class->method()}"; https://dev59.com/ZWkw5IYBdhLWcg3wSoks - dlaub3
1
这很有帮助。我也强烈同意@dlaub3的观点,$class->prop(即使没有花括号!)在我的经验中几乎总是比{$var}更有效。 - Daniel

21

有点晚了,但我想补充一下:

你甚至可以在花括号中使用变量,以动态地从类中访问对象的方法。

例如:

$username_method = 'username';
$realname_method = 'realname';

$username = $user->{$username_method}; // $user->username;
$name = $user->{$realname_method}; // $user->realname

不是一个好的例子,但是可以用来演示功能。

根据@kapreski在评论中的要求,提供另一个示例。

/**Lets say you need to get some details about the user and store in an 
array for whatever reason.  
Make an array of what properties you need to insert. 
The following would make sense if the properties was massive. Assume it is
**/

$user = $this->getUser(); //Fetching User object

$userProp = array('uid','username','realname','address','email','age');

$userDetails = array();

foreach($userProp as $key => $property) {
    $userDetails[] =  $user->{$property};       
}

print_r($userDetails);

循环完成后,您将在$userDetails数组中看到从用户对象获取的记录。

在php 5.6上进行了测试。


1
在我看来,将变量用花括号括起来的主要用途实际上是使用变量的内容来引用对象属性。 - Tuhin Paul
你能否添加一个更详细的示例或链接到一篇提供实际应用案例的文章,谢谢。 - kapreski
@karpreski。我添加了一个新的例子。希望它变得更加清晰 :) - Sanjok Gurung
1
看起来无论我是否使用花括号,$username = $user->$username_method;的输出结果都是相同的。我有什么遗漏了吗? - LobsterBaz

3
据我所知,您可以使用变量$x
echo "this is my variable value : $x dollars";

...但如果变量和周围的文本之间没有任何空格,你应该使用{}。例如:

echo "this is my variable:{$x}dollars";

因为如果你把它写成$xdollars,那么它就会被解释为另一个变量。


除了语法之外,echo "this is my variable:{$x}dollars";echo "this is my variable:" . $x . "dollars";之间有什么区别吗? - LobsterBaz
从技术上讲,一个是字符串连接(使用点(.)连接字符串),而另一个是格式化字符串。 还有一种echo“这是我的变量:”,$x,“美元”;的方式,这可能是最快的,但请记住,这种,语法将实际函数参数与echo()分隔开,因此它特定于echo()。 - daten
我无法再编辑上面的评论了,但是上面的echo示例中逗号分隔参数的说法似乎不正确。echo("foo", "bar");是无效的。这使得上面的示例(echo "this is my variable:", $x, "dollars";-)更加特定于echo函数。 - daten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接