PHP中关联数组的插值(双引号string)

当插入PHP的string索引数组元素(5.3.3,Win32)时,可能会出现以下行为:

$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代码 。 任何解释? 这个function可以信任吗?


编辑:为了减less误解,现在把张贴的地方设置为粗体

是的,你可以信任它。 插入variables的所有方法都包含在文档中 。

如果你想有一个理由这样做,那么,我不能帮你在那里。 但是一如既往:PHP是老的并且已经发展了很多,因此引入了不一致的语法。

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

例如,请考虑以下代码:

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

这将输出以下内容:

 $arr[key] within string is: val 

也就是说,编写这样的代码可能不是最好的做法,而是使用:

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

要么

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

句法。

最后一个是由PHP标记器处理的特殊情况。 它不查找是否定义了任何由该名称定义的常量,它总是假设一个string字面值来与PHP3和PHP4兼容。

回答你的问题,是的,是的,它可以,很像内爆和爆炸,PHP是非常非常宽容…所以不一致性比比皆是

我不得不说,我喜欢PHP的基本菊花冲压variables插入string然后在那里,

但是,如果你只使用单个数组的对象进行stringvariables插值,可能会更容易编写一个模板,您可以将特定的对象variablesdaisy打印(比如说javascript或python),从而显式控制variables作用域和对象被应用到string

我虽然这个人的isprintf真的对这种事情有用

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

 <?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