PHP extract() 函数从数组中把变量导入到当前的符号表中。对于数组中的每个元素,键名用于变量名,键值用于变量值。
下面是PHP的超级全局变量,可以了解一个特性,全是数组。
GLOBALS,所有全局变量数组
G
L
O
B
A
L
S
,
所
有
全
局
变
量
数
组
_SERVER, 服务器环境变量数组
GET,通过GET方法传递给脚本的变量数组
G
E
T
,
通
过
G
E
T
方
法
传
递
给
脚
本
的
变
量
数
组
_POST, 通过POST方法传递给脚本的变量数组
COOKIE,cookie变量数组
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
<?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)
<?php
$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
<?php
$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
<form action="action.php" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
<?php
extract($_POST);
//相当于$username = $_POST['username'];
//$password = $_POST['password'];
?>
<form action = "1.php" method="post">
<input type="text" name="ai">
<input type="submit" value="tijiao">
</form>
1.php
<?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保证已有变量不会被覆盖。
<?php
$auth='0';
extract($_GET);
if($auth==1){
echo "private!";
}
else{
echo "public!";
}
?>
当构造http://www.a.com/x.php?auth=1时,可打印出private!