PHP中的关联数组的插值(双引号字符串)

Interpolation (double quoted string) of Associative Arrays in PHP

插入php的字符串索引数组元素时(5.3.3,win32)以下行为可能是预期的或非预期的:

1
2
3
4
5
6
7
8
9
10
11
$ha = array('key1' => 'Hello to me');

print $ha['key1'];   # correct (usual way)
print $ha[key1];     # Warning, works (use of undefined constant)

print"He said {$ha['key1']}"; # correct (usual way)
print"He said {$ha[key1]}";   # Warning, works (use of undefined constant)

print"He said $ha['key1']";   # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print"He said $ha[ key1 ]";   # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print"He said $ha[key1]";     # !! correct (How Comes?)

最后一行似乎是正确的PHP代码。有什么解释吗?是否可以信任此功能?

编辑:为了减少误解,发帖点现在设置为粗体。


是的,你可以相信。文档中很好地介绍了变量的所有插值方法。

如果你想知道为什么这么做的原因,我不能帮你。但和往常一样:PHP是老的,已经发展了很多,因此引入了不一致的语法。


是的,这是定义良好的行为,并且始终查找字符串键'key',而不是(可能未定义的)常量key的值。

例如,考虑以下代码:

1
2
3
$arr = array('key' => 'val');
define('key', 'defined constant');
echo"\$arr[key] within string is: $arr[key]";

这将输出以下内容:

1
$arr[key] within string is: val

也就是说,编写这样的代码可能不是最佳实践,而是使用:

1
$string ="foo {$arr['key']}"

1
$string = 'foo ' . $arr['key']

语法。


最后一个是由php标记器处理的特殊情况。它不查找是否定义了该名称的任何常量,它始终假定字符串文本与php3和php4兼容。


要回答您的问题,是的,是的,它可以,而且非常像内爆和爆炸,PHP是非常宽容的…所以矛盾比比皆是

我不得不说,我喜欢PHP的插值,它可以将变量以菊花的形式插入字符串中,

但是,如果只使用单个数组的对象进行字符串变量插值,则编写一个模板可能会更容易,您可以将特定的对象变量菊花打印到模板中(如javascript或python),从而对应用于字符串的变量范围和对象进行显式控制。

我觉得这家伙的指纹对这类事情很有用

http://www.frenck.nl/2013/06/string-interpolation-in-php.html

1
2
3
4
5
6
7
8
9
10
11
<?php

$values = array(
    'who'   => 'me honey and me',
    'where' => 'Underneath the mango tree',
    'what'  => 'moon',
);

echo isprintf('%(where)s, %(who)s can watch for the %(what)s', $values);

// Outputs: Underneath the mango tree, me honey and me can watch for the moon