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
精彩评论