你不需要循环,你想要extract:
extract($_POST); // But use caution, see below
注意事项和最佳做法
如 cmets 中所述,这会强制 $_POST 数组中的所有参数进入当前符号空间。
在全局空间中
<?php
extract($_GET);
var_dump($_SERVER); // Can be overwritten by the GET param
?>
上面的代码说明了as shown in this answer 的问题——一些非常危险的东西可以在 global 空间中被覆盖。
函数内部
function myFunc() {
// (Mostly) empty symbol space! (excluding super globals)
extract($_POST);
}
在函数内部,作为第一行,没有坏处。
重要提示:您可能认为因为$_SERVER 是super global,这个漏洞也可能发生在函数内部 .然而,在我的测试中,在 PHP 版本 5.3.4 上,它是在函数内安全——$_SERVER、$_POST、$_GET、$_SESSION 都不是,或者可能是其他超全局变量,可能会被覆盖。
有选项
您也可以使用extract with extract_type options that do not overwrite。
在我看来,最好的选择是简单地为提取中的所有变量添加前缀:
// $_GET = test=1&name=Joe
extract($_GET, EXTR_PREFIX_ALL, "request_get");
echo $request_get_test; // 1
echo $request_get_name; // Joe
这样你就没有覆盖问题,但你也知道你从数组中得到了所有东西。
备用 - 带条件的循环
如果您想手动(但仍然是动态地)执行此操作,或只想有条件地提取少数变量,您可以使用variable variables:
foreach ($_POST as $key => $value) {
if (isset($$key)) continue;
$$key = $value;
}
(我使用的示例条件是防止覆盖。)