变量覆盖
一、递增递减
<?php
$a = 10;
$b = 30;
//++$a == 11 ===> $a += 1; $a == 11;
if (++$a == 11 &&
//$b -- == 29 ===> $b == 29 $b -= 1
$b-- == 29) {
++$a;
--$b;
}
echo $a . "\n" . $b;
/*
$a = 10;
$b = 30;
if (++$a == 11 ||
$b-- == 29) {
++$a;
--$b;
}
echo $a . "\n" . $b;
*/
$a = 55;
$b = 30;
if (++$a == 55 || $b-- == 29) {
++$a;
--$b;
}
echo $a . "\n" . $b;
二、register_globals
1. php版本5.4以下才可以使用register_globals
2. 需要更改php.ini配置文件里面的内容,register_globals=On
register_globals的意思就是注册为全局变量
当On的时候,将GET POST COOKIE中的值注册为全局变量
而Off的时候,我们需要到特定的数组里去得到它
举例:
<?php
echo ini_get('register_globals');
if(isset($a)){
echo 'ok';
}
拿GET举例,这里不存在$_GET['a']
但是当register_globals设置为On的时候
url中传参?a=hello,会被自动认为是$a = hello;
POST和COOKIE与之类似
三、foreach结合$
<?php
foreach (array('_COOKIE', '_POST', '_GET') as $_request) {
foreach ($$_request as $_key => $_value) {
$$_key = $_value;
}
}
$id = isset($id) ? $id : 2;
if ($id == 1) {
echo "flag{bihuo.cn}";
die();
}
echo $id;
原理: 经过foreach遍历数组中 $$_key = $_value;
也是拿GET举例
加入存在$_GET['id'] = 1
$$_key ===>因为$_key = id 所以 $$_key = $id
$value = 1
因此 $$_key = $_value ===> $id = 1
四、extract
extract 将数组中的键值对导入到全局符号表 (全局变量)
<?php
$name = 'tianjin';
$arr = array('name'=>'bihuo','age'=>18);
//extract($arr,EXTR_OVERWRITE);
//extract($arr,EXTR_SKIP);
//echo $name;
//echo '<br>';
//echo $age;
//extract($arr,EXTR_PREFIX_SAME,'bihuo');
//extract($arr,EXTR_PREFIX_ALL,'bihuo');
var_dump($GLOBALS);
(1) 当extract的第二个参数为EXTR_OVERWRITE时,如果变量名有冲突,覆盖已有的变量。
(2) 当extract的第二个参数为EXTR_SKIP时,如果变量名有冲突,不覆盖已有的变量。
(3) 当extract的第二个参数为EXTR_PREFIX_SAME时,如果变量名有冲突,在有冲突的变量名前加上前缀 prefix。
(4) 当extract的第二个参数为EXTR_PREFIX_ALL时,不管变量名有没有冲突,都会给所有变量名加上前缀 prefix。
五、parse_str
1. parse_str() 函数把查询字符串解析到变量中,如果没有array参数,则由该函数设置的变量将覆盖已存在的同名变量。
<?php
error_reporting(0);
$a = "www.bihuo.cn";
$id = $_GET['id'];
@parse_str($id);
var_dump($a);
if ($a[0] != "QNKCDZO" && md5($a[0]) == md5("QNKCDZO")) {
echo "success";
} else {
exit("failure");
}
?>
2. parse_str 函数如果传递第二个参数 此时会将 对应的键值对赋值到新的数组中 而不是 导出到全局变量表
<?php
parse_str('a=12345',$arr);
var_dump($arr);
六、mb_parse_str
mb_parse_str — 解析 GET/POST/COOKIE 数据并设置全局变量
<?php
mb_parse_str('a=12345');
echo $a;
七、import_request_variables
import_request_variables 函数可以在 register_global = off 时,把 GET/POST/Cookie 变量导入全局作用域中。
(PHP 4 >= 4.1.0, PHP 5 < 5.4.0)
import_request_variables('pcg','a');
//var_dump($GLOBALS);
echo $aa;
import_request_variables 最终多变量覆盖 依赖type类型的值来先后的处理
gpc 谁在最后,最后的变量值就打印谁
gpc ===> cookie
cgp ===> post
pcg ===> get