PHP 字符串插值语法

新手上路,请多包涵

我尝试使用以下语法进行重定向:

 header("location: readMore.php?id=$post['post_id']");

但它没有用。只有在有人建议将大括号放在 $post['post_id'] 之后,它才起作用!

正确的语法是:

 header("location: readMore.php?id={$post['post_id']}");

在这种情况下,花括号有什么作用?

原文由 Pioneer2017 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 603
1 个回答

引用 手册

当用双引号或 heredoc 指定 字符串 时,将在其中解析 变量

有两种类型的语法:一种是 简单 的,一种是 复杂 的。简单的语法是最常见和方便的。它提供了一种方法,可以轻松地将变量、 数组 值或 对象 属性嵌入到 字符串 中。

表达式周围的大括号可以识别复杂的语法。

您的第一个代码使用简单的语法,而您的第二个代码使用复杂的语法。

该手册没有明确说明这一点,但简单语法中的空格 似乎是一个错误,使您的第一个代码无效。据我所知,复杂的语法 似乎 支持与常规 PHP 相同的语法,但这似乎并不能在任何地方得到实际保证。

一般来说,字符串插值非常笨拙:

 $a = [['derp']];
$b = $a[0];

// Works. It prints derp
echo "$b[0]";

// Doesn't work. It throws an error
echo "$b[ 0 ]";

// Works. It prints derp
echo "{$b[ 0 ]}";

// Doesn't work. It prints Array[0]
echo "$a[0][0]";

// Works. It prints derp
echo "{$a[0][0]}";

// Doesn't work. It prints { Array[0] }
echo "{ $a[0][0] }";

您会遇到与 $object -> foo$object->foo->bar 类似的问题。

对我来说,那是纯粹的疯狂。出于这个原因,我已经开始尽可能避免使用双引号字符串(我唯一使用它们的目的是转义序列,如 "\n" )。我改为使用单引号和字符串连接,如下所示:

 header( 'location: readMore.php?id=' . $post[ 'post_id' ] );

这使您可以对变量使用 实际 的 PHP 语法,而无需可怕的死亡陷阱,即字符串插值。

原文由 Siguza 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏