2014-09-06 56 views
0

使用开关和动态变量的下列代码应返回“b1”,但返回“11”。使用动态变量的意外结果

这是一个错误还是我做错了什么?

<?php 
$d = "Tuesday"; 
switch($d) { 
         case "Monday":   
      $$previousdayofmonthrow = "a"; 
      $$previousdayofmonthcol = "7"; 
      break; 

         case "Tuesday":    
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "1"; 
      break; 

         case "Wednesday": 
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "2"; 
      break; 

         case "Thursday": 
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "3"; 
      break; 

         case "Friday": 
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "4"; 
      break; 

         case "Saturday": 
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "5"; 
      break; 

         case "Sunday": 
      $$previousdayofmonthrow = "b"; 
      $$previousdayofmonthcol = "6"; 
      break; 
       } 

    echo $$previousdayofmonthrow; 
    echo $$previousdayofmonthcol; 

?> 

直播示例>http://codepad.org/wNfCqffD

+0

使用'$'而不是'$$'。它会给'b1' – MH2K9 2014-09-06 03:04:46

+0

@ user3659034'$'应该给他什么都没有,因为它没有设置任何东西。 – Prix 2014-09-06 03:07:07

+0

@Prix你是对的!根据他的问题,我建议他!谢谢。 – MH2K9 2014-09-06 03:09:25

回答

3

tldr; 这不是PHP中与动态变量相关的错误,也不涉及switch语句。

测试案例的行为是正确并且定义明确,即使不是预期的。

这是因为$previousdayofmonthrow$previousdayofmonthcol评价为undefined(没有启用通知,不是吗?),因此这两个"dynamic variables" (aka variable-variable)表达对同一个变量操作。

Here is a minimal reproduction of the the behavior而不的开关,其还示出了一些有趣的中间值:

$x = undefined; // The original doesn't set a value; it is implicitly undefined 
$y = undefined; // but the effect is the same, and this way avoids warnings - yay! 
$$x = "a"; 

echo $$x;   // -> "a" 
echo $$y;   // -> "a" 

$$y = "b"; 

echo $$x;   // -> "b" 
echo $$y;   // -> "b" 

因为,如前所述,会发生此“链接”行为,可变变量表达式访问相同的变量 - 主要是称为“未定义”的变量。 (用作动态变量名的表达式的值变成一个字符串和"" . undefined -> "undefined"):

echo ${"undefined"}; // -> "b" 

这种“的未定义的分配”是允许的,因为undefined在PHP是一个保留字 - 和一个常数/变量。因此,即使它不能作为不加引号的标识符出现,也不禁止使用“未定义”作为变量名称。

FWIW:考虑而不是使用变量变量;当需要这种“动态密钥”时,使用离散数组几乎总是更好。

+1

+1很好的解释,我开始测试后得出了相同的结果。 – Prix 2014-09-06 03:50:16