‘Variable variables’ and array syntax ambiguity in PHP

In PHP it’s possible to define variable variables, variables with names that are set and used dynamically.

Normal variables are set with statements like:

<?php
 
  $fruit = 'apple';
 
?>

Variable variables are set by using two dollar signs in front of a normal variable‘s name:

<?php
 
  $fruit = 'apple';
  $$fruit = 'red';
 
?>

This results in two variables being defined: $fruit with the value ‘apple‘, and $apple with the value ‘red‘, which means that these two echo statements will produce the same results:

<php
 
  $fruit = 'apple';
  $$fruit = 'red';
 
  echo "$fruit ${$fruit}";
  echo "$fruit $apple";
 
?>

Associative arrays and foreach loops

Multiple variable variables can be created from associative arrays using a foreach loop:

<?php
 
  $fruit = array('lime'   => 'green',
                 'apple'  => 'red',
                 'banana' => 'yellow');
 
  foreach ($fruit as $key=>$value)
  {
    $$key = $value;
  }
 
  print_r($fruit);
 
  echo "\nLime: {$lime}\n";
  echo "\nApple: {$apple}\n";
  echo "\nBanana: {$banana}\n";
 
?>

… resulting in:

Array
(
    [lime] => green
    [apple] => red
    [banana] => yellow
)
 
Lime: green
 
Apple: red
 
Banana: yellow

Ambiguity

Keep in mind that when variable variables are used with arrays, there is an inherent ambiguity problem (see the PHP code examples below). If you write $$fruit[1], the parser needs to know if you meant:

Use ‘$fruit[1]‘ as the variable name, hence creating ‘$apple’ with a value of ‘red‘:

<?php
 
  $fruit = array('lime',
                 'apple',
                 'banana');
 
  $$fruit[1] = 'red';
 
?>

… or…

Assign ‘red‘ to the ‘[1]‘ index on ‘$$fruit’, hence creating an array ‘$apple’ with ‘red‘ in position ‘[1]‘:

<?php
 
  $fruit = 'apple';
 
  $$fruit[1] = 'red';
 
?>

The syntax for resolving this ambiguity is ${$fruit[1]} for the first case and ${$fruit}[1] for the second:

<?php
 
  $fruit = array('lime',
                 'apple',
                 'banana');
 
  ${$fruit[1]} = 'red';
 
 
  $fruit = 'apple';
 
  ${$fruit}[1] = 'red';
 
?>

Tags: , , , , , ,

No comments yet.

Leave a Reply