开发者

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  
开发者_JAVA百科echo $$aaa; //displays hello world  
?>


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


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


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.


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


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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜