使用动态变量的意外结果

时间:2014-09-06 03:01:06

标签: php variable-variables

以下使用开关和动态变量的代码应返回" 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;

?>

实例&gt; http://codepad.org/wNfCqffD

1 个答案:

答案 0 :(得分:3)

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

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

这是因为 $previousdayofmonthrow$previousdayofmonthcol评估为未定义(确实启用了通知,没有?)因此两个"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"

这&#34;链接&#34;行为发生的原因是,如前所述,变量变量表达式访问相同的变量 - 主要是名为&#34; undefined&#34;的变量。 (用作动态变量名称的表达式的值将变为字符串"" . undefined -> "undefined"):

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

这是&#34;未定义&#34;的分配允许,因为PHP中的undefined是保留字 - 而不是常量/变量。因此,不禁止使用&#34; undefined&#34;作为变量名称,即使它不能作为不带引号的标识符出现。

FWIW:使用变量变量考虑 not ;当这样的&#34;动态密钥&#34;时,使用离散数组几乎总是更好。是必需的。