Using braces with dynamic variable names in PHP
Wrap them in {}
:
${"file" . $i} = file($filelist[$i]);
Working Example
Using ${}
is a way to create dynamic variables, simple example:
${'a' . 'b'} = 'hello there';
echo $ab; // hello there
I do this quite often on results returned from a query..
e.g.
// $MyQueryResult is an array of results from a query
foreach ($MyQueryResult as $key=>$value)
{
${$key}=$value;
}
Now I can just use $MyFieldname (which is easier in echo statements etc) rather than $MyQueryResult['MyFieldname']
Yep, it's probably lazy, but I've never had any problems.
Overview
In PHP, you can just put an extra $
in front of a variable to make it a dynamic variable :
$$variableName = $value;
While I wouldn't recommend it, you could even chain this behavior :
$$$$$$$$DoNotTryThisAtHomeKids = $value;
You can but are not forced to put $variableName
between {}
:
${$variableName} = $value;
Using {}
is only mandatory when the name of your variable is itself a composition of multiple values, like this :
${$variableNamePart1 . $variableNamePart2} = $value;
It is nevertheless recommended to always use {}
, because it's more readable.
Differences between PHP5 and PHP7
Another reason to always use {}
, is that PHP5 and PHP7 have a slightly different way of dealing with dynamic variables, which results in a different outcome in some cases.
In PHP7, dynamic variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the mix of special cases in PHP5. The examples below show how the order of evaluation has changed.
Case 1 : $$foo['bar']['baz']
- PHP5 interpetation :
${$foo['bar']['baz']}
- PHP7 interpetation :
${$foo}['bar']['baz']
Case 2 : $foo->$bar['baz']
- PHP5 interpetation :
$foo->{$bar['baz']}
- PHP7 interpetation :
$foo->{$bar}['baz']
Case 3 : $foo->$bar['baz']()
- PHP5 interpetation :
$foo->{$bar['baz']}()
- PHP7 interpetation :
$foo->{$bar}['baz']()
Case 4 : Foo::$bar['baz']()
- PHP5 interpetation :
Foo::{$bar['baz']}()
- PHP7 interpetation :
Foo::{$bar}['baz']()
Try using {}
instead of ()
:
${"file".$i} = file($filelist[$i]);