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

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.