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是老的,已经发展了很多,因此引入了不一致的语法。
是的,这是定义良好的行为,并且始终查找字符串键
例如,考虑以下代码:
1 2 3 |
这将输出以下内容:
1 |
也就是说,编写这样的代码可能不是最佳实践,而是使用:
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 |