我尝试使用以下语法进行重定向:
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
引用手册:
语法有两种:简单语法和复杂语法.简单的语法是最常见和最方便的.它提供了一种在字符串中嵌入变量,数组值或对象属性的方法,只需花费最少的精力.
复杂的语法可以被表达式周围的花括号识别.
您的第一个代码使用简单的语法,第二个代码使用复杂的代码.
手册没有明确说明这一点,但简单语法中的空格似乎是一个错误,使您的第一个代码无效.复杂的语法似乎支持与常规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语法进行变量,而不会出现字符串插值的可怕死亡陷阱.
我来到这个问题是为了了解更多关于常量插值语法的信息,当这些 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 上在线测试以上内容。这是基于这个答案,并提供了一些在插值括号内进行操作的示例。
括号允许 PHP 将里面的内容作为变量读取。您也可以这样做:
header("location: readMore.php?id=" . $post['post_id']);
Run Code Online (Sandbox Code Playgroud)