以下使用开关和动态变量的代码应返回“ 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;
?>
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] 删除。
我来说两句