提问人:Brandon McConnell 提问时间:4/8/2021 更新时间:4/8/2021 访问量:230
PHP 变量变量不覆盖原始变量
PHP variable variable not overriding original variable
问:
我试图使用变量变量覆盖我的 PHP 文件中的一些变量,但我得到了意想不到的结果,其中原始值从未被覆盖,但新的变量-变量值与原始变量对应值具有唯一值。
$case1 = (time() > strtotime('11/22/2020 07:00:00:000AM'));
$case2 = (time() > strtotime('11/16/2020 07:00:00:000AM'));
$case3 = (time() > strtotime('12/01/2020 12:00:00:000PM'));
$case4 = (time() > strtotime('04/24/2021 05:00:00:000AM'));
if (!empty($_GET['schedule_test'])) { $$_GET['schedule_test'] = true; }
如果有人访问了页面路径,上面的行应该覆盖变量,因为这等于使语句等价于 。/?schedule_test=case4
$case4
$_GET['schedule_test']
case4
$$_GET['schedule_test'] = true
$case4 = true
但是,即使在访问 URL 路径时,我仍然会获得 的值。我var_dumped 和 的值,它们的值不同:/?schedule_test=case4
false
$case4
$case4
$$_GET['schedule_test']
echo $case4; // false
echo $$_GET['schedule_test']; // true
预期的目标是能够在任何设定的时间内测试这四种情况中的任何一种,并将 URL 参数设置为任何变量名称(例如 、 、 、 )。schedule_test
case1
case2
case3
case4
答:
为了将变量变量与数组一起使用,您必须解决歧义问题。也就是说,如果你写了 $$a[1],那么解析器需要知道你是打算使用 $a[1] 作为变量,还是希望 $$a 作为变量,然后是该变量的 [1] 索引。解决这种歧义的语法是:第一种情况为 ${$a[1]},第二种情况为 ${$a}[1]。
所以,你应该使用
${$_GET['schedule_test']}
但是,我强烈建议不要直接使用用户输入来决定像这样编写哪个变量。允许攻击者更改代码的内部行为的风险非常高。
评论
由于是一个数组,你不能用来访问和获取变量的值,这与PHP的内部解析器不知道你是否要访问然后键或键,然后是变量,这在变量变量的文档中讨论过,上面的例子#1三段。要解决此问题,您必须用大括号包围您的括号。$_GET
$$
$_GET
$$_GET
$_GET
$_GET
if (! empty($_GET['schedule_test'])) {
${$_GET['schedule_test']} = true;
}
echo $case4;
echo ${$_GET['schedule_test']};
评论
$userIsAdmin
false
/?schedule_test=userIsAdmin
$is_admin