extract()变量覆盖

PHP extract() 函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
下面是PHP的超级全局变量,可以了解一个特性,全是数组。
GLOBALS, G L O B A L S , 所 有 全 局 变 量 数 组 _SERVER, 服务器环境变量数组
GETGET G E T , 通 过 G E T 方 法 传 递 给 脚 本 的 变 量 数 组 _POST, 通过POST方法传递给脚本的变量数组
COOKIEcookie C O O K I E , c o o k i e 变 量 数 组 _REQUEST,所有用户输入的变量数组,包括 GET, G E T , _POST和 COOKIE C O O K I E 所 包 含 的 输 入 内 容 _FILES,与文件上传相关得变量数组
ENV E N V , 环 境 变 量 数 组 _SESSION,会话变量数组
可以通过本地测试一下 phpstudy
写入 1.php


var_dump($_GET);
?>

访问http://127.0.0.1/test2.php?key=123&b=85f 得到array(2) { [“key”]=> string(3) “123” [“b”]=> string(3) “85f” }
extract(array,extract_rules,prefix)

 
$a = 'Original'; 
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); 
extract($my_array); 
echo "\$a = $a; \$b = $b; \$c = $c"; 
?> 

输出:
a=Cat; a = C a t ; b = Dog;
$c = Horse

 
$a = 'Original'; 
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse"); 
extract($my_array, EXTR_PREFIX_SAME, 'dup'); 
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;"; 
?> 

输出:
a=Original; a = O r i g i n a l ; b = Dog;
c=Horse; c = H o r s e ; dup_a = Cat;
前缀和数组键名之间会自动加上一个下划线。
extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值
可以说为数组的操作提供了另外一个方便的工具,比方说,可以很方便的提取 POST P O S T 或 者 _GET的元素,对表单提交上来的内容不能不用一一赋值,直接使用下面代码:
form.html

"action.php" method="post"> type="text" name="username"> type="password" name="password"> type="submit">

在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php

$_POST); 
//相当于$username = $_POST['username']; 
//$password = $_POST['password']; 
?> 
"1.php" method="post">
type="text" name="ai">
type="submit" value="tijiao">
1.php

@extract($_POST,EXTR_SKIP);
echo $ai
?>

当输入 jkl 输出 为 jkl 可以看到 我们没有用 POST P O S T 去 接 受 变 量 a
把数组中的键名直接注册为了变量,就像把 POST[ai] P O S T [ a i ] 直 接 注 册 为 了 ai
安全的做法是确定register_globals=OFF后,在调用extract()时使用EXTR_SKIP保证已有变量不会被覆盖。


$auth='0';
extract($_GET);
if($auth==1){
echo "private!";
}
else{
echo "public!";
}
?>

当构造http://www.a.com/x.php?auth=1时,可打印出private!

你可能感兴趣的:(extract()变量覆盖)