使用动态变量的意外结果

加里·卡莱尔·库克(Gary Carlyle Cook)

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

用户名

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

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

这是因为两者 $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"):

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

允许这种“未定义的赋值”,因为undefined在PHP中是保留字-而不是常量/变量。因此,即使不能将“ undefined”用作变量名,也不能禁止使用它。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章