可变变量名指的是使用一个变量的值作为这个变量的名称
使用中例子如下
$a=array('fantasy','android');
$b='a';
print_r($$b);
但是在函数跟类中使用的话要注意作用域:
$a=array('fantasy','android');
test();
function test()
{
$b='a';
print_r($$b);
}
这里会出现Notic:
Notice: Undefined variable: a in
也就是说 函数体外部声明的变量$a是全局变量
函数内部的$$b 其实是函数作用内部的变量 $a 函数内部没变量$a 报错如上,若我们将代码修改如下:
$a=array('fantasy','android');
test();
function test()
{
$a = 'inner var';
$b='a';
print_r($$b);
}
输出结果是 : inner var ;由此证明了设想中的变量作用域问题
若想在函数里面访问全局变量需要这样:
$a=array('fantasy','android');
test();
function test()
{
$b='a';
global $$b;
print_r($$b);
}
输出结果是 全局变量 $a
Array ( [0] => fantasy [1] => android )
在class中若要是用这种方式访问全局变量也是这样的方法,如果是想访问class内部的属性则不需要这样,如下:
$t = new test;
class test
{
public $a=array('fantasy','android');
public function test()
{
$b='a';
print_r($this->$b);
}
}
打印结果:
Array ( [0] => fantasy [1] => android )
由此,类的一个特性是,属性是可以被各种方法使用的,并且不用传递参数给方法,在类范围内全局可用
整个问题归结出来就是变量在函数 类中的作用域问题
---------------update @2014-12-16------------------
值得注意的是,当我们在局部 通过可变变量名的方式访问全局变量的时候 是 访问的这个变量的引用
// 全局变量
$a = 'name';
// 通过可变变量名访问全局变量 并且修改变量值
function a(){
$var = 'a';
global $$var;
$$var = 'other';
}
a();
// 输出
echo $a;
输出结果是 : other 说明个时候访问的是变量的引用
但是当我们对这个变量进行unset操作的时候情况就会发生改变
以下引用手册说明
unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
如果您想在函数中 unset() 一个全局变量,可使用 $GLOBALS 数组来实现:
与可变变量无关的,如果我们想要用 unset 删除一个全局变量是行不通的,我们只能通过对 $GLOBALS 的值进行销毁才能真正的去销毁一个全局变量