以下使用开关和动态变量的代码应返回" 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
答案 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;时,使用离散数组几乎总是更好。是必需的。