2010-07-23 116 views
13

這是否有合理的解釋?這是一個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

回答

7

如果您嘗試

$$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

2

我敢打賭,它的定義變量的東西的${''}沿着這些線路的影響,或沒有名字的變量,或東西。

由於既不$a也不$aa也不$aaa被定義,它們在可變可變上下文中使用時都指向相同的時髦,空白變量名。

1

那麼,如果$ a是空的,那麼您將設置一個空變量名稱='hello world'...因此,每當您引用空變量名稱時,您都會得到存儲的內容。 。

這就像

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

你沒有得到它的權利,考慮一下:

$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

12

在做

$$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