在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非常方便。