PHP的可变变量名使用方法详解

有时候可变的变量名会给编程带来很大的方便。也就是说变量名可以被动态的命名和使用。通常变量通过下面这样的语句来命名 :

 代码如下 复制代码

    <?php
    $a = 'hello';
    ?>

可变变量名指的是使用一个变量的值作为这个变量的名称。在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样。

 代码如下 复制代码
    <?php
    $$a = 'world';
    ?>

通过上面的两个语句,有两个变量被定义:变量$a,装的内容是”hello” 以及变量$hello,装的内容是 “world”。 于是,下面的语言:

 代码如下 复制代码

    <?php
    echo "$a ${$a}";
    ?>

跟下面的语句的输出完全一致:

 代码如下 复制代码

    <?php
    echo "$a $hello";
    ?>

它们都输出:hello world。

为了使用数组的可变变量名,你需要解决一个歧义问题。就是,如果你写$$a[1],解析器需要明白究竟你的意思是要把$a[1]当成一个变量,还是要把$$a当成变量、[1]指的是这个变量的索引。解决这个歧义问题的语法是:第一种情况使用${$a[1]},第二种情况使用${$a}[1]。

类属性也可以通过可变属性名来访问。可变属性名从产生调用所在的变量的访问范围内获取。例如,如果你的表达式是这样的:$foo->$bar,那么运行时将会在本地变量范围内寻找变量$bar,它的值将会做为$foo对象的一个属性名。如果$bar是个数组也可以使用。

例1 可变变量名

 代码如下 复制代码

    <?php
    class foo {
        var $bar = 'I am bar.';
    }
 
    $foo = new foo();
    $bar = 'bar';
    $baz = array('foo', 'bar', 'baz', 'quux');
    echo $foo->$bar . "n";
    echo $foo->$baz[1] . "n";
    ?>

上面的例子将会输出下面的结果:

I am bar.

I am bar.

警告

请注意,可变变量名不能用于PHP函数和类里的超级全局数组变量上。变量$this也是一个不能动态取名的特殊变量。

浅谈PHP可变变量安全

变变量是PHP一个非常方便的特性,手册里已经说了,可变变量的意思就是一个变量的变量名可以动态的设置!
 
那么变量的变量名可以动态设置会产生什么安全问题呢?下面来看看:

 代码如下 复制代码
 
<?php
$a = 'phpinfo';
$a();
?>

 
这段代码很容易理解,变量的类型是字符型phpinfo,变量动态加上了(),于是变量变成了phpinfo函数动态执行了!
 
 
 
按照同样的原理我们引用手册中可变变量的例子:
 

 代码如下 复制代码
<?php
$a = 'phpinfo';
${$a()};
?>
 
$a()

这个动态函数放入动态变量,当然我这个说法有点不专业,还是可变变量,我们会发现phpinfo函数还是执行了!
 
 
 
看过手册还有我给出的这个例子的话,大家一定觉得这个一点都不神奇,这就是PHP的语法特性,然后我们把这个东西再进化缩成一行:
 

 代码如下 复制代码
<?php
 
$a = "${${phpinfo()}}";
 
?>
 

这是一个2个嵌套的可变变量,我们只是按照上面一个例子将可变变量的内容自己填写进去了,实际上就是把某个函数赋给某个变量,所以phpinfo函数最终执行了,也就化成了各种漏洞和webshell的原型!
 
 
 
看到这里大家应该知道了,为什么当初大牛们要我去看PHP手册吧,然而本文到这里就结束了么,咱还漏了一点,大牛说了安全就是基础,咱其实还没把这个东西搞清楚,为什么前面例子的变量是用的单引号,而后面的最终的例子用的是双引号,如果你想到了这个问题,我觉得你做安全肯定非常有潜力,以后保不准就是一大牛!
 
 
 
PHP中单引号和双引号的区别还是和变量有关,来看下面的例子:
 

 代码如下 复制代码
<?php
$a = 'phpinfo()';
echo $a; //输出phpinfo()字符串
echo '$a'; //输出$a字符串
echo "$a"; //输出phpinfo()字符串
?>

双引号里的内容会再经过PHP的语法解析变量,而单引号里的内容就直接定性为字符串了!
 
 
 
所以本文到这里就真正结束了,于是大家应该也都明白了,当初牛人为什么和我说多看PHP手册和安全就是基础的深意。

时间: 2024-09-10 14:41:50

PHP的可变变量名使用方法详解的相关文章

php中static静态变量的使用方法详解_php基础

看看下面的实例: 复制代码 代码如下: <?php function Test() { $w3sky = 0; echo $w3sky; $w3sky++; } ?> 本函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0".将变量加一的 $w3sky++ 没有其到效果,因为一旦退出本函数则变量 $w3sky 就不存在了.要写一个不会丢失本次计数值的计数函数,要将变量 $w3sky 定义为静态(static)的: 如下: 复制代码 代码如下: <?php f

PHP Session 变量的使用方法详解与实例代码_php技巧

当您运行一个应用程序时,您会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态.通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称.购买商品等).不过,会话信息是临时的,在用户离开网站后将被删除.如果您需要永久储存信息,可以把数据存储在数据库中. 把手册抄一下,然后每个都试试然后写出来,方便自己查阅滴,谁

sql实现修改表字段名的方法详解_MsSql

sp_rename N'表名.字段名','新字段名','column'sp_rename更改当前数据库中用户创建对象(如表.列或用户定义数据类型)的名称. 语法sp_rename [ @objname = ] 'object_name' ,[ @newname = ] 'new_name'[ , [ @objtype = ] 'object_type' ] 参数[@objname =] 'object_name' 是用户对象(表.视图.列.存储过程.触发器.默认值.数据库.对象或规则)或数据类型

sql实现修改表字段名的方法详解

sp_rename N'表名.字段名','新字段名','column'sp_rename更改当前数据库中用户创建对象(如表.列或用户定义数据类型)的名称. 语法sp_rename [ @objname = ] 'object_name' ,[ @newname = ] 'new_name'[ , [ @objtype = ] 'object_type' ] 参数[@objname =] 'object_name' 是用户对象(表.视图.列.存储过程.触发器.默认值.数据库.对象或规则)或数据类型

PHP的可变变量名的使用方法分享_php技巧

通常变量通过下面这样的语句来命名 : 复制代码 代码如下: <?php $a = 'hello'; ?> 可变变量名指的是使用一个变量的值作为这个变量的名称.在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样. 复制代码 代码如下: <?php $$a = 'world'; ?> 通过上面的两个语句,有两个变量被定义:变量$a,装的内容是"hello" 以及变量$hello,装的内容是 "world".

PHP的可变变量名介绍

有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 : <?php $a = "hello"; ?>  可变变量名指的是使用一个变量的值作为这个变量的名称.在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样. <?php $$a = "world"; ?>  通过上面的两个语句,有两个变量被定义:变量$a,装的内容是"hello&qu

PHP的可变变量名

有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 : <?php  $a = 'hello';  ?>  可变变量名指的是使用一个变量的值作为这个变量的名称.在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样. <?php  $$a = 'world';  ?>  通过上面的两个语句,有两个变量被定义:变量$a,装的内容是"hello" 以及变量$hello,装

ai-求OC中自动生成变量名的方法

问题描述 求OC中自动生成变量名的方法 如题 求大神指导.比如 char * a1="aaaaaaaa"; char * a2="bbbbbbb"; char * a3="ccccccccc"; ............ char * an="nnnnnnn"; 变量命名规则都是char * an n值是从1到n的数字,n我知道. 问题:如何依次遍历a1到an 想要类似如下的用法 for(int i=0;i<n;i++)

数组与类使用PHP的可变变量名需要的注意的问题_php技巧

有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 :$a = 'hello';可变变量名指的是使用一个变量的值作为这个变量的名称.在上面的例子中,通过使用两个$符号,你可以把hello设置成一个变量的名称,就像下面那样.$$a = 'world'; 通过上面的两个语句,有两个变量被定义:变量$a,装的内容是"hello" 以及变量$hello,装的内容是 "world". 于是,下面的语言:echo &