PHP VERSION: 8.2.18

uniform_variable_syntax_expression_meaning_changes.php

<?php
// expression meaning changes

/*
                        // old meaning            // new meaning
$$foo['bar']['baz']     ${$foo['bar']['baz']}     ($$foo)['bar']['baz']
$foo->$bar['baz']       $foo->{$bar['baz']}       ($foo->$bar)['baz']
$foo->$bar['bat']()     $foo->{$bar['bat']}()     ($foo->$bar)['bat']()
Foo::$bar['ban']()      Foo::{$bar['ban']}()      (Foo::$bar)['ban']()
*/

$foo['bar']['baz'] = 'php5';
$php5 'Works in PHP5';
$php7 'Works in PHP7';

echo 
PHP_EOL;
echo 
"\$\$foo['bar']['baz']\n";
echo 
"-----------------------------------------------\n";
echo 
"old meaning                new meaning\n";
echo 
"-----------------------------------------------\n";
echo 
'${$foo["bar"]["baz"]}     ($$foo)["bar"]["baz"]' PHP_EOL;
echo 
"-----------------------------------------------\n";

// works in PHP5; generates error in PHP7
var_dump($$foo['bar']['baz']);
echo 
PHP_EOL;

$abc['bar']['baz'] = 'Works in PHP7';
$foo 'abc';

// works in PHP7; generates error in PHP5
var_dump($$foo['bar']['baz']);
echo 
PHP_EOL;


class 
Foo
{
    public 
$test  = ['bar' => 'test1''baz' => 'Works in PHP7'];
    public 
$test1 'TEST1';
    public 
$test2 'TEST2';
    public 
$test3 'Works in PHP5';
    public function 
test4()
    {
        return function () { return 
'TEST4'; };
    }
    public static function 
test5()
    {
        return function () { return 
'TEST5'; };
    }
}

$bar = ['baz' => 'test3'];
$foo = new Foo();

echo 
PHP_EOL;
echo 
"\$foo->\$bar['baz']\n";
echo 
"-----------------------------------------------\n";
echo 
"old meaning               new meaning\n";
echo 
"-----------------------------------------------\n";
echo 
'$foo->{$bar["baz"]}      ($foo->$bar)["baz"]' PHP_EOL;
echo 
"-----------------------------------------------\n";

// works in PHP5; generates error in PHP7
var_dump($foo->$bar['baz']);
echo 
PHP_EOL;

// works in PHP7; generates error in PHP5
$bar 'test';
var_dump($foo->$bar['baz']);
echo 
PHP_EOL;

echo 
PHP_EOL;
echo 
"\$foo->\$bar['bat']()\n";
echo 
"-----------------------------------------------\n";
echo 
"old meaning               new meaning\n";
echo 
"-----------------------------------------------\n";
echo 
'$foo->{$bar["bat"]}()    ($foo->$bar)["bat"]()' PHP_EOL;
echo 
"-----------------------------------------------\n";

$bar = ['bat' => 'test4'];
var_dump($foo->$bar['bat']());
echo 
PHP_EOL;

$bar 'test4';
//var_dump($foo->$bar['bat']());
echo PHP_EOL;

/*
// old meaning            // new meaning
// $foo->{$bar['bat']}()     ($foo->$bar)['bat']()
try {
    echo $foo->$bar['bat']();
} catch (Exception $e) {
    echo $e->getMessage();
}
echo PHP_EOL;

// old meaning            // new meaning
// Foo::{$bar['ban']}()      (Foo::$bar)['ban']()
echo Foo::$bar['ban']();
*/

Output


$$foo['bar']['baz']
-----------------------------------------------
old meaning                new meaning
-----------------------------------------------
${$foo["bar"]["baz"]}     ($$foo)["bar"]["baz"]
-----------------------------------------------
NULL

string(13) "Works in PHP7"


$foo->$bar['baz']
-----------------------------------------------
old meaning               new meaning
-----------------------------------------------
$foo->{$bar["baz"]}      ($foo->$bar)["baz"]
-----------------------------------------------
NULL

string(13) "Works in PHP7"


$foo->$bar['bat']()
-----------------------------------------------
old meaning               new meaning
-----------------------------------------------
$foo->{$bar["bat"]}()    ($foo->$bar)["bat"]()
-----------------------------------------------

Unknown Error or Exception!
SOURCE CODE