PHP字符串插值语法

Pio*_*017 9 php

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

header( "location: readMore.php?id=$post[ 'post_id' ]" ); 
Run Code Online (Sandbox Code Playgroud)

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

正确的语法:

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

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

Sig*_*uza 14

引用手册:

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

语法有两种:简单语法和复杂语法.简单的语法是最常见和最方便的.它提供了一种在字符串中嵌入变量,数组值或对象属性的方法,只需花费最少的精力.

复杂的语法可以被表达式周围的花括号识别.

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

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

字符串插值通常非常简洁:

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

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

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

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

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

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

// Doesn't work, prints { Array[0] }
echo "{ $a[0][0] }";
Run Code Online (Sandbox Code Playgroud)

$object -> foo$object->foo->bar.有类似的问题.

对我来说,那是纯粹的疯狂.出于这个原因,我尽可能避免使用双引号字符串(我使用它们的唯一方法就是转义序列"\n").我反而使用单引号和字符串连接,如下所示:

header( 'location: readMore.php?id=' . $post[ 'post_id' ] );
Run Code Online (Sandbox Code Playgroud)

这使您可以使用实际的 PHP语法进行变量,而不会出现字符串插值的可怕死亡陷阱.

  • 像所有语言功能一样,字符串插值在不滥用的情况下非常有用。每天我都会在一堆讨厌的引号和点上使用长插值字符串。 (5认同)
  • 这个答案说插值至少是糟糕的三倍,但从未给出原因。显然,不属于的空白(或任何字符)会导致错误。这并不是语言功能不好的例子,而是将字符放在不属于它们的地方的例子。如果我在常规的、未插值的变量中间插入空格,它们也会被破坏。 (5认同)
  • @felwithe你给出了为什么它是这样的理由,但这并没有使它变得不那么糟糕。我并不是说我可以把它建得更好,但这仍然不意味着它是合理的。 (5认同)
  • 如果他们决定只允许单一语法,那么一切都会很好地工作。例如,这个中断:`$amount = 500; $str = "我有 ${$amount} 美元"` (2认同)
  • @Siguza:删除第一句话似乎使一切变得不同。我之前阅读答案的方式肯定被这句话影响了很多,因为现在我不知道为什么我这么生气。对不起! (2认同)

Arm*_*oot 6

我来到这个问题是为了了解更多关于常量插值语法的信息,当这些 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;
Run Code Online (Sandbox Code Playgroud)

输出:

你好呀,

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

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

那么先有鸡还是先有蛋呢?

您可以在 3v4l 上在线测试以上内容。这是基于这个答案,并提供了一些在插值括号内进行操作的示例

  • 聪明的。我已经验证相同的技术可以在双引号字符串中使用! (2认同)

Oen*_*n44 2

括号允许 PHP 将里面的内容作为变量读取。您也可以这样做:

header("location: readMore.php?id=" . $post['post_id']);
Run Code Online (Sandbox Code Playgroud)