使用动态变量的意外结果

Unexpected results using dynamic variables

提问人:Gary Carlyle Cook 提问时间:9/6/2014 最后编辑:user2864740Gary Carlyle Cook 更新时间:10/12/2014 访问量:57

问:

以下使用 switch 和动态变量的代码应返回“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 的实况示例

php 变量

评论

0赞 MH2K9 9/6/2014
使用 代替 。它会给$$$b1
0赞 Prix 9/6/2014
@user3659034不应该给他任何东西,因为上面没有任何东西。$
0赞 MH2K9 9/6/2014
@Prix你是对的!我根据他的问题推荐了他!谢谢。
0赞 Gary Carlyle Cook 9/6/2014
我不知道为什么我得到了反对票?我正在学习,这给了我一种误报。
0赞 Chris Baker 9/6/2014
同意这里的建议。打开错误报告,并最小化您的代码,以尝试隔离和重现您认为是 bug 的内容。很多时候,当你在提问之前做功课时,你会意识到自己在这个过程中的错误,根本不需要问问题。

答:

3赞 user2864740 9/6/2014 #1

顶级域名;它不是PHP中与动态变量相关的错误,也与switch语句无关。

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

这是因为 和 的计算结果均为 undefined(是否启用了通知,不是吗?),因此两个“动态变量”(又名变量-变量)表达式都对同一变量进行操作$previousdayofmonthrow$previousdayofmonthcol

这是该行为的最小再现没有开关,它还显示了一些有趣的中间值:

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

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

这种“未定义的赋值”是允许的,因为在PHP中是一个保留字 - 而不是常量/变量。因此,不禁止使用“undefined”作为变量名称,即使它不能显示为未加引号的标识符。undefined

FWIW:考虑使用变量变量;当需要这样的“动态键”时,使用离散数组几乎总是更好的。

评论

1赞 Prix 9/6/2014
+1 很好的解释,在我开始测试后,我得出了相同的结果。