问题
When interpolating PHP\'s string-indexed array elements (5.3.3, Win32) the following behavior may be expected or not:
$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?)
Inerestingly, the last line seems to be correct PHP code. Any explanations? Can this feature be trusted?
Edit: The point of the posting now set in bold face in order to reduce misunderstandings.
回答1:
Yes, you may trust it. All ways of interpolation a variable are covered in the documentation pretty well.
If you want to have a reason why this was done so, well, I can't help you there. But as always: PHP is old and has evolved a lot, thus introducing inconsistent syntax.
回答2:
Yes, this is well defined behavior, and will always look for the string key 'key', and not the value of the (potentially undefined) constant key.
For example, consider the following code:
$arr = array('key' => 'val');
define('key', 'defined constant');
echo "\$arr[key] within string is: $arr[key]";
This will output the following:
$arr[key] within string is: val
That said, it's probably not best practice to write code like this, and instead either use:
$string = "foo {$arr['key']}"
or
$string = 'foo ' . $arr['key']
syntax.
回答3:
The last one is a special case handled by the PHP tokenizer. It does not look up if any constant by that name was defined, it always assumes a string literal for compatibility with PHP3 and PHP4.
回答4:
To answer your question, yes, yes it can, and much like implode and explode, php is very very forgiving... so inconsistency abound
And I have to say I like PHP's interpolation for basical daisy punching variables into strings then and there,
However if your doing only string variable interpolation using a single array's objects, it may be easier to write a template which you can daisy print a specific object variables into (like in say javascript or python) and hence explicit control over the variable scope and object being applied to the string
I though this guy's isprintf really useful for this kind of thing
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
来源:https://stackoverflow.com/questions/4738850/interpolation-double-quoted-string-of-associative-arrays-in-php