Skip to main content

Is this a php variable variable bug?



Is there a logical explanation to this?







<?php

$$a = 'hello world';

echo $$a; //displays hello world

echo $$aa; //displays hello world

echo $$aaa; //displays hello world

?>







Source: Tips4all

Comments

  1. if you try

    $$a = 'hello world';
    echo $$a; //displays hello world
    echo $$aa; //displays hello world
    echo $$aaa; //displays hello world


    die( "<pre>" . print_r( get_defined_vars(), true ) . "</pre>" );


    You can see that it has registed a variable with no name so yes, according to PHP's naming conventions, this would be a bug

    ReplyDelete
  2. When doing

    $$a = 'foo';


    you are saying take the value of $a. Convert it to string. Use the String as variable name to assign 'foo' to it. Since $a is undefined and returns NULL, which when typecasted to String is '', you are assigning the variable ${''};

    echo ${''}; // 'foo'


    Ironically, you can do

    ${''} = 'foo'; /* but not */ $ = 'foo';


    And you can do

    ${''} = function() { return func_get_arg(0); };
    echo ${''}('Hello World');
    // or
    echo $$x('Hello World');


    which would trigger a notice about $x being undefined but output Hello World then. Funny enough, the following doesnt work:

    ${''} = function() { return func_get_arg(0); };
    echo $x('Hello World');


    Because it triggers Fatal error: Function name must be a string. Quirky :D

    Since the PHP manual says


    Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.


    I'd consider being able to assign an empty named variable a bug indeed.

    There is a somewhat related bug filed for this already:


    http://bugs.php.net/bug.php?id=39150

    ReplyDelete
  3. I'm betting that it's defining the variable as something to the effect of ${''}, or a variable with no name, or something along those lines.

    Since neither $a nor $aa nor $aaa are defined, they all point to the same funky, blank variable name when used in a variable variable context.

    ReplyDelete
  4. Well, if $a is empty, then you're setting an empty variable name to = 'hello world'... So then every time you reference that empty variable name, you'll get what's stored there...

    It's just like

    $a = '';
    $$a = 'Foo Bar';
    $b = '';
    echo $$b; //Displays Foo Bar

    ReplyDelete
  5. You are not getting it right, consider this:

    $a = 'hello';
    $hello = "hello again";
    echo $$a;


    Output:

    hello again


    In your case, you have not set the value of following variables, so it outputs the same.

    Explanation:

    When you do $$a, it means:

    $ $a;
    ^ ^
    $ used for php vars means a's value that is hello


    So it becomes:

    $hello


    Whose value is:

    hello again

    ReplyDelete
  6. set $a first, then you don't have to worry about this bug.

    ReplyDelete

Post a Comment