提问人:Gary Carlyle Cook 提问时间:9/6/2014 最后编辑:user2864740Gary Carlyle Cook 更新时间:10/12/2014 访问量:57
使用动态变量的意外结果
Unexpected results using dynamic variables
问:
以下使用 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;
?>
答:
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 很好的解释,在我开始测试后,我得出了相同的结果。
评论
$
$$
b1
$