In PHP, you can embed a variable into a string in these two ways:
$a = 'b';
echo "1: $a"; // outputs "1: b"
echo "2: {$a}"; // outputs "2: b"
echo "1: $a"; // outputs "1: b"
echo "2: {$a}"; // outputs "2: b"
However, you can also embed it in this arguably-more-confusing way:
echo "3: ${a}"; // outputs "3: b", but why!?
And, moreover:
$b = 'c';
echo "4: ${$a}"; // outputs "4: c". This is insanity.
echo "4: ${$a}"; // outputs "4: c". This is insanity.
For the third case, I guess the logic is that whatever is inside the braces is interpreted as an expression and, in PHP, when using an undefined constant (in this case, a
), the parser translates it to a string ("a"
), making ${a}
the same as $a
. However, you normally get a warning when this conversion happens, which doesn't show for us:
php > echo hello;
PHP Warning: Use of undefined constant hello - assumed 'hello' (this will throw an Error in a future version of PHP) in php shell code on line 1
hello
PHP Warning: Use of undefined constant hello - assumed 'hello' (this will throw an Error in a future version of PHP) in php shell code on line 1
hello
Luckily, these two cases are being deprecated and going away in PHP 9.
Final thoughts
It's nice to see PHP slowly get better as a language. It's already unrecognizable from its earlier versions.