这是一个PHP变量的变量错误?

问题描述:

这是否有合理的解释?这是一个PHP变量的变量错误?

<?php 
$$a = 'hello world'; 
echo $$a; //displays hello world 
echo $$aa; //displays hello world 
echo $$aaa; //displays hello world 
?> 
+0

这可能是不,它不是,他没有得到正确的PHP 5.3的行为 – Dami 2010-07-23 13:12:30

+0

。 – Sarfraz 2010-07-23 13:20:18

+0

谢谢大家。换句话说,这是有道理的。 echo $ {null}; 也是有效的。 – Dami 2010-07-23 13:21:04

如果您尝试

$$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>"); 

你可以看到,它已经临时用户与没有名字的变量,因此,是的,根据PHP的命名规则,这将是一个错误

+0

所以违反了PHP的命名约定,变量可以为null或空字符串 – Dami 2010-07-23 13:24:03

+0

我认为他引用了变量名称本身的命名约定。 '$ var'是一个变量,但'$'不是... – 2010-07-23 13:26:22

+0

我不确定是什么让这个错误。这绝对不是好的做法,我希望PHP会在默认情况下提出类似这样的警告,但行为是一致的。 – Matchu 2010-07-23 13:46:04

我敢打赌,它的定义变量的东西的${''}沿着这些线路的影响,或没有名字的变量,或东西。

由于既不$a也不$aa也不$aaa被定义,它们在可变可变上下文中使用时都指向相同的时髦,空白变量名。

那么,如果$ a是空的,那么您将设置一个空变量名称='hello world'...因此,每当您引用空变量名称时,您都会得到存储的内容。 。

这就像

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

你没有得到它的权利,考虑一下:

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

输出:

hello again 

在你的情况,你有没有设置下列变量的值,因此它输出相同。

说明:

当你做$$a,它意味着:

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

所以就变成:

$hello 

,其值是:

hello again 
+0

我了解变量变量,我只是觉得可以有一个未命名的变量,或者一个变量的空值或空字符串作为其名称。 – Dami 2010-07-23 13:22:32

在做

$$a = 'foo'; 

你说拿的$a值。将其转换为字符串。使用字符串作为变量名称来为其分配'foo'。由于$a未定义,并且返回NULL,当将字符串转换为字符串时,它是'',您正在分配变量${''};

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

讽刺的是,你可以做

你可以做

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

这将触发通知有关$x被不确定的,但输出Hello World然后。够滑稽的,下面不工作:

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

,因为它触发致命错误:函数名称必须是一个字符串。新奇:d

由于PHP手册说

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.

我会考虑能确实分配一个空命名变量的错误。

有一个有点相关的bug提交了本已:

+1

不确定这是否具有讽刺意味,这不正是你所期望的吗?对于解析器是如何工作的,这并不多说,它只能识别空字符串的显式声明。免责声明:我对PHP一无所知。 – Grantismo 2010-07-23 14:17:41

+0

@Grantismo当我不能做$ ='foo'时,我希望PHP阻止我做$ {''} ='foo',而且手册指出变量必须有一个名称。另外,分配变量的常用方法是没有花括号。但是,让你想知道解析器:) – Gordon 2010-07-23 14:27:26