11_变量覆盖

变量覆盖

一、递增递减

<?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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值