在PHP中的string中的大括号

在PHP的string文字中, { } (花括号)是什么意思?

这是string插值的复杂(曲线)语法 。 从手册:

复杂(curl)的语法

这不称为复杂的,因为语法是复杂的,但是因为它允许使用复杂的expression式。

任何具有string表示的标量variables,数组元素或对象属性都可以通过此语法包含在内。 简单地写出expression式的方式与string外部的方式相同,然后将其包装在{} 。 由于{不能被转义,这个语法只有在$紧跟在{才能被识别。 用{\$来得到一个文字{$ 。 一些例子要说清楚:

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

performance完全一样:

 $out = "{$a} {$a}"; // same 

所以大括号是不必要的。 但是这个

 $out = "$aefgh"; 

将取决于你的错误级别,不工作或产生错误,因为没有variables名为$aefgh ,所以你需要做的:

 $out = "${a}efgh"; // or $out = "{$a}efgh"; 

对于我来说,花括号可以代替拼接,它们键入的速度更快 ,代码看上去更干净。 请记住使用双引号(“”),因为它们的内容是由PHP parsing的,因为在单引号('')中,您将获得提供的variables的字面名称

 <?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 ?> 

例:

 $number = 4; print "You have the {$number}th edition book"; //output: "You have the 4th edition book"; 

没有花括号PHP会试图find一个名为$numberth ,不存在的variables!

我也发现访问属性名称随某个迭代器而变化的对象属性很有用。 例如,我使用下面的一组时间段:小时,天,月。

 $periods=array('hour', 'day', 'month'); foreach ($periods as $period) { $this->{'value_'.$period}=1; } 

这个模式也可以用来访问类方法。 只需使用string和stringvariables以相同的方式构build方法名称即可。

你可以很容易地争辩说,只是使用一个数组来存储期限的值。 如果这个应用程序只是PHP,我会同意。 当类属性映射到数据库表中的字段时,我使用这种模式。 尽pipe可以使用序列化将数组存储在数据库中,但如果必须对各个字段进行索引,则效率低下,毫无意义。 我经常添加一个由迭代器键入的字段名称数组,以实现两全其美。

 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, ); } } 

这里是我从一个wordpress插件得到的代码

 $data = $wpdb->get_results("select * from {$wpdb->prefix}download_monitor_files"); 

这对格式化复杂的string非常方便。