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']}");
在这种情况下,大括号有什么作用?
我试图用这种语法做重定向:
header("location: readMore.php?id=$post['post_id']");
但它没有奏效。只有在有人建议将大括号放在周围之后,它才起作用!$post['post_id']
正确的语法是:
header("location: readMore.php?id={$post['post_id']}");
在这种情况下,大括号有什么作用?
引用手册:
有两种类型的语法:简单语法和复杂语法。简单的语法是最常见和最方便的。它提供了一种以最少的工作量在字符串中嵌入变量、数组值或对象属性的方法。
复杂的语法可以通过表达式周围的大括号来识别。
第一个代码使用简单的语法,第二个代码使用复杂的语法。
该手册没有明确说明这一点,但简单语法中的空格似乎是一个错误,导致您的第一个代码无效。据我所知,复杂的语法似乎支持与常规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语法,而不会出现字符串插值的可怕死亡陷阱。
我来到这个问题是为了更多地了解常量插值语法,当这些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上在线测试上述内容。这是基于这个答案,还有几个例子,在插值括号内有操作。