PHP中字符串文字中{ }
(花括号)的含义是什么?
答案 0 :(得分:252)
这是字符串插值的complex (curly) syntax。从手册:
复杂(卷曲)语法
这不称为复杂,因为语法很复杂,但是因为 它允许使用复杂的表达式。
带字符串的任何标量变量,数组元素或对象属性 可以通过此语法包含表示。简单地写一下 表达式与字符串外部的表达方式相同,并且 然后将其包装在
{
和}
中。由于无法转义{
,因此使用此语法 只有$
紧跟{
后才能识别。使用{\$
获取文字{$
。一些例子说清楚:<?php // Show all errors error_reporting(E_ALL); $great = 'fantastic'; // Won't work, outputs: This is { fantastic} echo "This is { $great}"; // Works, outputs: This is fantastic echo "This is {$great}"; echo "This is ${great}"; // Works echo "This square is {$square->width}00 centimeters broad."; // Works, quoted keys only work using the curly brace syntax echo "This works: {$arr['key']}"; // Works echo "This works: {$arr[4][3]}"; // This is wrong for the same reason as $foo[bar] is wrong outside a string. // In other words, it will still work, but only because PHP first looks for a // constant named foo; an error of level E_NOTICE (undefined constant) will be // thrown. echo "This is wrong: {$arr[foo][3]}"; // Works. When using multi-dimensional arrays, always use braces around arrays // when inside of strings echo "This works: {$arr['foo'][3]}"; // Works. echo "This works: " . $arr['foo'][3]; echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; echo "This is the value of the var named by the return value of getName(): {${getName()}}"; echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}"; // Won't work, outputs: This is the return value of getName(): {getName()} echo "This is the return value of getName(): {getName()}"; ?>
通常,这种语法是不必要的。例如,这个:
$a = 'abcd';
$out = "$a $a"; // "abcd abcd";
的行为完全相同:
$out = "{$a} {$a}"; // same
所以花括号是不必要的。但是这个:
$out = "$aefgh";
根据你的错误级别,会不起作用或产生错误,因为没有名为$aefgh
的变量,所以你需要这样做:
$out = "${a}efgh"; // or
$out = "{$a}efgh";
答案 1 :(得分:46)
就我而言,花括号用作连接的替代,它们更快来键入,代码看起来更干净。请记住使用双引号(“”),因为PHP的内容被解析,因为在单引号('')中,您将获得提供的变量的文字名称:
<?php
$a = '12345';
// This works:
echo "qwe{$a}rty"; // qwe12345rty, using braces
echo "qwe" . $a . "rty"; // qwe12345rty, concatenation used
// Does not work:
echo 'qwe{$a}rty'; // qwe{$a}rty, single quotes are not parsed
echo "qwe$arty"; // qwe, because $a became $arty, which is undefined
?>
答案 2 :(得分:14)
示例:
$number = 4;
print "You have the {$number}th edition book";
//output: "You have the 4th edition book";
如果没有花括号,PHP会尝试找到一个名为$numberth
的变量,该变量不存在!
答案 3 :(得分:3)
我还发现访问对象属性很有用,其中属性名称因某些迭代器而异。例如,我使用了下面的模式来表示一组时间段:小时,天,月。
$periods=array('hour', 'day', 'month');
foreach ($periods as $period)
{
$this->{'value_'.$period}=1;
}
此相同模式也可用于访问类方法。只需使用字符串和字符串变量以相同的方式构建方法名称。
您可以轻易地争辩只是按周期使用数组来存储值。如果这个应用程序只是PHP,我会同意。当类属性映射到数据库表中的字段时,我使用此模式。虽然可以使用序列化将数组存储在数据库中,但是如果必须对各个字段建立索引,则效率低下并且没有意义。我经常添加一个由迭代器键入的字段名称数组,以实现两全其美。
class timevalues
{
// Database table values:
public $value_hour; // maps to values.value_hour
public $value_day; // maps to values.value_day
public $value_month; // maps to values.value_month
public $values=array();
public function __construct()
{
$this->value_hour=0;
$this->value_day=0;
$this->value_month=0;
$this->values=array(
'hour'=>$this->value_hour,
'day'=>$this->value_day,
'month'=>$this->value_month,
);
}
}
答案 4 :(得分:-5)
这是我从一个wordpress插件获得的代码
$data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files");
这对于格式化复杂字符串非常方便。