The new variable syntax is probably one of the most impacting features of the PHP 7 release. It brings greater order into variable dereferencing. The impacting part, however, not only affects changes for better as it also introduces certain backwards compatibility (BC) breaks. Among the main reasons for these changes were inconsistencies with variable variable syntax.
Observing the $foo['bar']->baz expression, first a variable named $foo is fetched, then the bar offset is taken from the result, and, finally, the baz property is accessed. This is how normally variable accesses is interpreted, from left to right. However, the variable variable syntax goes against this principle. Observing the $$foo['baz'] variable, $foo is fetched first, then its baz offset, and finally looking for the variable with the name of the result is done.
The newly introduced uniform variable syntax addresses these inconsistencies as per the following example:
/*** expression syntax ***/
$$foo['bar']['baz']
// PHP 5.x meaning
${$foo['bar']['baz']}
// PHP 7.x meaning
($$foo)['bar']['baz']
/*** expression syntax ***/
$foo->$bar['baz']
// PHP 5.x meaning
$foo->{$bar['baz']}
// PHP 7.x meaning
($foo->$bar)['baz']
/*** expression syntax ***/
$foo->$bar['baz']()
// PHP 5.x meaning
$foo->{$bar['baz']}()
// PHP 7.x meaning
($foo->$bar)['baz']()
/*** expression syntax ***/
Foo::$bar['baz']()
// PHP 5.x meaning
Foo::{$bar['baz']}()
// PHP 7.x meaning
(Foo::$bar)['baz']()
Other than addressing the preceding inconsistencies, several new syntax combinations have been added that make the following expressions now valid:
$foo()['bar']();
[$obj1, $obj2][0]->prop;
getStr(){0}
$foo['bar']::$baz;
$foo::$bar::$baz;
$foo->bar()::baz()
// Assuming extension that implements actual toLower behavior
"PHP"->toLower();
[$obj, 'method']();
'Foo'::$bar;
There are quite a few different syntaxes here. While some of this might seem overwhelming and hard to find use for, it opens a door for new ways of thinking and code use.