PHP 字符串插值语法

php
2022-08-30 16:03:21

我试图用这种语法做重定向:

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

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

正确的语法是:

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

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


答案 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语法,而不会出现字符串插值的可怕死亡陷阱。


答案 2

我来到这个问题是为了更多地了解常量插值语法,当这些PHP“<<<”的东西被用来创建称为Heredocs的多行字符串时(它允许变量插值,不像Nowdocs)。

但是,似乎没有针对它们的特定语法,因此一个简单的解决方法是创建一个闭包来执行此操作。在这里,它只是一个分配给变量的匿名函数,该变量将使用参数调用:

$int = 'intruder';        // Variable
define('con', '"smart"'); // Constant
// For complex interpolation:
// 1. Define a closure (anonymous function)
// 2. Assign it to a variable with a short name (e.g.: _ )
// 3. Invoke the function by calling the variable with parameters enclosed in ()
$_ = function ($val){return $val;};

$doc = <<<TXT
Hi there,
One day I caught this $int nearby.
I was then told that actually other {$_(con)} $int was there before.
So who came first, the chicken or the egg?
TXT;                      // Heredoc
echo $doc;

输出:

嘿,你好

有一天,我在附近抓住了这个入侵者。

然后我被告知,实际上以前还有其他“聪明”的入侵者。

那么谁先来,先有鸡还是先有蛋?

您可以在3v4l上在线测试上述内容。这是基于这个答案,还有几个例子,在插值括号内有操作


推荐